标题:C语言编程,将十六进制转换为八进制,大体思想就是先将十六进制转换为十进制 ...
只看楼主
蝴蝶扣
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:76
注 册:2016-7-18
结帖率:83.33%
已结贴  问题点数:20 回复次数:6 
C语言编程,将十六进制转换为八进制,大体思想就是先将十六进制转换为十进制,再转换为八进制,但是程序运行结果有误,请各位大神帮帮忙,看看我的代码错在哪里?谢谢了!
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274

我的代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
    char str[10];
    int n,num,k=1,sum=0;
    int sh,res[100],j=0;//这个res[100]表示8进制数的数组序列
    scanf("%d",&n);
    while(n--)
    {
        gets(str);
        for(int i=strlen(str);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进制的结果
        sh=sum/8;//这里的sh表示商
        while(sh!=0)
        {
            res[j]=sum%8;
            j++;
            sum=sh;
            sh=sum/8;
        }
        printf("%d",sum);
        for(int t=j;t>=0;t--)
            printf("%d",res[t]);
    }
}




        
搜索更多相关主题的帖子: 十六进制 include 八进制 十进制 C语言 
2016-09-16 19:03
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
改了一下大致能用
#include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
  main()
 {
     int n,num,k,sum;
     int sh,j;//这个res[100]表示8进制数的数组序列
    //scanf("%d",&n);
    n=1;
   // 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进制的结果
        //这里的sh表示
        j=0;               //你原先这里多除了一次。
        while(sum!=0)
         {
            
             res[j]=sum%8;
             j++;
             sum=sum/8;
         }
         //printf("%d",sum);
         for(int t=j-1;t>=0;t--)
             printf("%d",res[t]);
             printf("\n");      //加个回车使输出整洁。
     }
 }
2016-09-16 19:57
蝴蝶扣
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:76
注 册:2016-7-18
得分:0 
回复 2楼 ehszt
您好!非常感谢您的解答。但是,我还有一个问题要请教您,如果严格按照题目要求的输入输出格式 :  
样例输入
 2
 39
 123ABC
 样例输出
 71
 4435274

是不是用指针比较好?还是您还有其他的办法?期待您的恢复!
2016-09-17 11:19
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
把我注释掉的scanf和getchar恢复,把n=1删掉。可以实现先输入循环次数,然后输入一个数输出一个数。但一次性输入一次性输出还是满足不了。
好像要用到ACM,具体的就不清楚了。
2016-09-17 11:26
蝴蝶扣
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:76
注 册:2016-7-18
得分:0 
回复 4楼 ehszt
谢谢您耐心的解答,我自己再想想办法
2016-09-17 13:55
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:10 
改用二维数组,或者改用链表
2016-09-17 16:18
sumbor
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-9-12
得分:0 
我感觉楼主不用这么麻烦编写算法吧,用输入 scanf("%x",&i)和输出printf("%o",i)就能实现输入16进制和输出8进制的转换了!
2016-09-17 23:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-468856-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.363248 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved