2 wd hudiekou wd_hudiekou 于 2016.09.17 14:03 提问

C语言要求将16进制数转换为8进制数,编写了代码,但是不能按题目要求输入输出,请大神帮忙解答,谢谢!

问题描述
  给定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");    
  }

}

3个回答

arthurlee
arthurlee   2016.09.17 14:34

算法没有大问题,str的大小给的有些小了。scanf足够聪明。

修改如下:
1. 删除getchar();这一行
2. gets(str);这一行修改成scanf("%s", str);就可以了

测试通过。

arthurlee
arthurlee   2016.09.17 14:35

/Users/arthur/temp/hex2oct> gcc hex2oct.c
/Users/arthur/temp/hex2oct> ./a.out < input.txt
71
4435274
/Users/arthur/temp/hex2oct>

arthurlee
arthurlee   2016.09.17 14:36
#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;
} 
Csdn user default icon
上传中...
上传图片
插入图片