问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
我的代码:
#include
#include
#include
void main()
{
int n,num,k,sum;
int res[100]={0};
int j;//这个res[100]表示8进制数的数组序列
scanf("%d",&n);
getchar(); //如果用scanf后面一定要加一个getchar()来吸收回车字符
while(n--)
{
char str[10]={0}; //每次循环都应该初始化,而不仅仅是开头
gets(str);
sum=0; //同上
k=1;
//int res[100]={0};
for(int i=strlen(str)-1;i>=0;i--) //数组下标的最大值比它的长度小一
{
if(str[i]>='A' && str[i]<='F')
{
num=str[i]-'A'+10;
sum+=num*k;
k*=16;
}
if(str[i]>='0' && str[i]<='9')
{
num=str[i]-'0';
sum+=num*k;
k*=16;
}
}
//printf("%d\n",sum);//这是16进制转化为10进制的结果
j=0;
while(sum!=0)
{
res[j]=sum%8;
j++;
sum=sum/8;
}
for(int t=j-1;t>=0;t--)
printf("%d",res[t]);
printf("\n");
}
}
算法没有大问题,str的大小给的有些小了。scanf足够聪明。
修改如下:
1. 删除getchar();这一行
2. gets(str);这一行修改成scanf("%s", str);就可以了
测试通过。
/Users/arthur/temp/hex2oct> gcc hex2oct.c
/Users/arthur/temp/hex2oct> ./a.out < input.txt
71
4435274
/Users/arthur/temp/hex2oct>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n, num, k, sum;
int res[100] = {0};
int j; //这个res[100]表示8进制数的数组序列
scanf("%d", &n);
while (n--) {
char str[10] = {0}; //每次循环都应该初始化,而不仅仅是开头
scanf("%s", str);
//printf("str = %s, str length = %ld\n", str, strlen(str));
sum = 0; //同上
k = 1;
// int res[100]={0};
for (int i = strlen(str) - 1; i >= 0; i--) //数组下标的最大值比它的长度小一
{
if (str[i] >= 'A' && str[i] <= 'F') {
num = str[i] - 'A' + 10;
sum += num * k;
k *= 16;
}
if (str[i] >= '0' && str[i] <= '9') {
num = str[i] - '0';
sum += num * k;
k *= 16;
}
}
// printf("%d\n",sum);//这是16进制转化为10进制的结果
j = 0;
while (sum != 0) {
res[j] = sum % 8;
j++;
sum = sum / 8;
}
for (int t = j - 1; t >= 0; t--)
printf("%d", res[t]);
printf("\n");
}
return 0;
}