标题:2017.2.26 十六进制转八进制,Dev上运行正确,但在蓝桥杯上提交后提示运行 ...
只看楼主
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
结帖率:71.43%
已结贴  问题点数:20 回复次数:10 
2017.2.26 十六进制转八进制,Dev上运行正确,但在蓝桥杯上提交后提示运行错误,求大神指导
/*
问题描述
  给定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>
int main(){
    int n=0,i=0,j=0,k=0,m=0,w[10]={0},length=0;
    char c[10]="",c2[50]="",c3[10][20],str[4]="";
    for(i=0;i<10;i++){
        strcpy(c3[i],"");
    }
    //c1为十六进制数,c2为转化成的二进制数,c3存储八进制数,每个结果为一行
    scanf("%d",&n);
   
    for(i=0;i<n;i++){
        
        strcpy(c2,"");
        k=0;
        
        scanf("%s",c);
        //转化成二进制数
        length=strlen(c);
        for(j=0;j<length;j++){
            switch(c[j]){
                case '0':strcat(c2,"0000");break;
                case '1':strcat(c2,"0001");break;
                case '2':strcat(c2,"0010");break;
                case '3':strcat(c2,"0011");break;
                case '4':strcat(c2,"0100");break;
                case '5':strcat(c2,"0101");break;
                case '6':strcat(c2,"0110");break;
                case '7':strcat(c2,"0111");break;
                case '8':strcat(c2,"1000");break;
                case '9':strcat(c2,"1001");break;
                case 'A':strcat(c2,"1010");break;
                case 'B':strcat(c2,"1011");break;
                case 'C':strcat(c2,"1100");break;
                case 'D':strcat(c2,"1101");break;
                case 'E':strcat(c2,"1110");break;
                case 'F':strcat(c2,"1111");break;
            }
        }//转化成二进制数
        
    //转化成八进制数
        j=strlen(c2)-1;
        while(j>=0){
        
            if(j==0){//位数不足,只剩一位时
                if(c2[0]=='0'){
                    c3[m][++k]='0';break;
                }
                else if(c2[0]=='1'){
                    c3[m][++k]='1';break;
                }
            }
            else if(j==1){//位数不足,只剩两位时
                if(c2[0]=='0'&&c2[1]=='0'){
                     c3[m][++k]='0';break;
                }
                else if(c2[0]=='0'&&c2[1]=='1'){
                     c3[m][++k]='1';break;
                }
                else if(c2[0]=='1'&&c2[1]=='0'){
                     c3[m][++k]='2';break;
                }
                else if(c2[0]=='1'&&c2[1]=='1'){
                     c3[m][++k]='3';break;
                }
            }
            else {//取得三位01串
                 ++k;
                 str[2]=c2[j];
                str[1]=c2[--j];
                str[0]=c2[--j];
              
                if(strcmp(str,"000")==0)c3[m][k]='0';
                if(strcmp(str,"001")==0)c3[m][k]='1';
                if(strcmp(str,"010")==0)c3[m][k]='2';
                 if(strcmp(str,"011")==0)c3[m][k]='3';
                 if(strcmp(str,"100")==0)c3[m][k]='4';
                if(strcmp(str,"101")==0)c3[m][k]='5';
                if(strcmp(str,"110")==0)c3[m][k]='6';
                if(strcmp(str,"111")==0)c3[m][k]='7';
               
                --j;
            }   
        }
        w[m]=k;
        m++;
        
    }//转化为八进制数
     
    //输出结果
    for(i=0;i<m;i++){
        k=w[i];
        if(c3[i][k]!='0')printf("%c",c3[i][k]); //避免输出前导0
        for(j=k-1;j>0;j--){
               printf("%c",c3[i][j]);
        }
        printf("\n");
    }
      
    return 0;
}
求大神@ W @
搜索更多相关主题的帖子: 十六进制 include 八进制 正整数 字符串 
2017-02-26 10:25
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
忙活半天,结果搞错了,没注意到给出的16进制是字符串。。



[此贴子已经被作者于2017-2-26 12:35编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-26 11:12
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
得分:0 
我的第一个注释有点错误:c是 十六进制数,不是c1

元气少女Leo_L
2017-02-26 11:29
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
得分:0 
回复 2楼 renkejun1942
我的代码测试数据是对的,但提交后就是提示“运行错误”,不知道是不是有哪些测试数据的情况没想到

元气少女Leo_L
2017-02-26 11:31
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 4楼 Leo_L
原来是对的啊。不好意思,我没注意。

[此贴子已经被作者于2017-2-26 12:35编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-26 12:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
每个十六进制数长度不超过100000。

算法嘛,就一无是处了
2017-02-27 08:52
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
回复 6楼 rjsp
应该不超过20行代码可解决吧。
2017-02-27 09:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
瞎写的
程序代码:
#include <stdio.h>
#include <string.h>

unsigned foo( const char* s, size_t len, size_t i )
{
    size_t a = i*3/4;
    size_t b = i*3%4;
    unsigned cl = s[len-a]<'A' ? s[len-a]-'0' : s[len-a]-'A'+10;
    unsigned ch = s[len-a-1]<'A' ? s[len-a-1]-'0' : s[len-a-1]-'A'+10;
    return ((cl+ch*16)>>b)%8;
}

int main( void )
{
    unsigned n;
    scanf( "%u", &n );
    while( n-- )
    {
        char s[1+100000+1] = "0";
        scanf( " %s", s+1 );

        size_t len = strlen(s+1);
        for( size_t i=(len*4+2)/3 - (foo(s,len,(len*4+2)/3-1)==0); i!=0; --i )
            putchar( '0'+foo(s,len,i-1) );
        putchar( '\n' );
    }

    return 0;
}

2017-02-27 10:56
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
得分:0 
回复 7楼 xzlxzlxzl
我也觉得我写的很麻烦呀,可是想不出别的方法。。请问是怎么能用不超过20行实现呀?求教[/笔芯]

元气少女Leo_L
2017-02-27 17:41
Leo_L
Rank: 2
等 级:论坛游民
帖 子:21
专家分:27
注 册:2017-2-26
得分:0 
回复 8楼 rjsp
请问那个size_t是什么意思呀

元气少女Leo_L
2017-02-27 17:43



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




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

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