C言語-文字列配列-16進数回転8進数(ブルーブリッジカップはn個の16進数の正の整数を与え、対応する8進数を出力する.)

12999 ワード

16進から8進へ
問題の説明
n個の16進数の正の整数を与え、対応する8進数を出力する.入力フォーマット入力の第1行目は正の整数n(1<=n<=10)である.次にn行目は、変換する16進数の正の整数を表す09、大文字AFからなる文字列であり、各16進数の長さは100000を超えない.出力フォーマットはn行を出力し、各行は対応する8進数の正の整数を入力する.
サンプル入力2 39 123 ABC
サンプル出力71 4435274
ヒント:このコードはブルーブリッジカップ16進数変換8進数の問題を解決するためではなく、文字列配列の入力を理解するためだけですが、ブルーブリッジカップの問題にヒントを与えることができます.その問題の入出力数値は大きすぎて、配列出力(途中で他の進数を変換するのはもちろん配列も使います)が使用できます.これにより、タイプの値範囲を考慮する必要はありません.本題の鍵は文字列の配列入力ですか.私はここで巧みに2次元配列を作りましたが、実質は最終的には同じです.
#include  
#include
#pragma warning(disable:4996)

void scale(char* str)
{
	int ten = 0, num = 0, n = 0;
	while (str[++num] != '\0') {
		;
	}
	int i = 0;
	while (i <= num) {
		if (str[i] >= '0' && str[i] <= '9')
		{
			n = (int)(str[i] - '0');
		}
		else if (str[i] >= 'a' && str[i] <= 'f')
		{
			n = (int)(str[i] - 'a' + 10);
		}
		else if (str[i] >= 'A' && str[i] <= 'F')
		{
			n = (int)(str[i] - 'A' + 10);
		}
		else
		{
			break;
		}
		ten += n * pow(16, (double)num - 1 - (double)i);
		i++;
	}
	int eight = 0,m=0;
	i = 0;
	while (ten)
	{
		m = ten % 8;
		ten /= 8;
		eight += m * pow(10, i);
		i++;
	}
	printf("%d", eight);
}

int main() 
{
	int num;
	scanf("%d",&num);
	char** arr;
	arr = (char**)malloc(num * sizeof(char*));  
	for (int i = 0; i < num; i++)
	{
		*(arr + i) = (char*)malloc(sizeof(char) * 100);
	}
	for (int i = 0; i < num; i++)
	{
		scanf("%s", arr[i]);
	}
	for (int i = 0; i < num; i++)
	{
		scale(arr[i]);
	}
	free(arr);
	return 0;
}