UVa 355 - The Bases Are Loaded

UVa 355 - The Bases Are Loaded

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<cstdio>

#include<iostream>

#include<math.h>

using namespace std;

int ifover(char c[],int a){

int statue = 0;

for(int i = 0; i < strlen(c); i++) {

if(c[i] >= '0' && c[i] <= '9'){

if(c[i] - '0' >= a)

statue = 1;

}else{

if(c[i] - 'A' + 10 >= a)

statue = 1;

}

}

return statue;

};//判断是否超出范围

int main(){

char c[11] = {0};

int a,b;

a = b = 0;

while(~scanf("%d %d %s",&a,&b,c)){

   //     if((a < 2 || a > 16) || (b < 2 || b > 16))

   //         PRintf("%s is an illegal base %d number\n",c,a);

if(ifover(c,a))

  printf("%s is an illegal base %d number\n",c,a);

else{

char m[42] = {0};

    char * pEnd;

        long long decimal = strtol(c, &pEnd , a);//十进制

/*long long decimal= 0LL;

for ( int i = 0 ; c[i] ; ++ i ) {

decimal *= a;

decimal += ctoi(c[i]);

}*/

for(int i = 0;i < 42;i++) {

int temp = decimal % b;

if(temp <= 9) m[42 - 1 - i] = temp + '0'; /////////////罪魁祸首

else m[42 - 1 - i] = temp - 10 + 'A';

decimal /= b;

if(decimal == 0) break;

}

printf("%s base %d = ",c,a);

int i = 0;

while(m[i] == '\0')  i++;

for(; i < 42; i++) printf("%c",m[i]);

printf(" base %d\n",b);

}

}

return 0;

}

1 这道题卡了我两天,不知道wa了多少次,最后错在标注了罪魁祸首的那一句,我把判断条件写成了小于42,真的不知道自己脑子怎么这么短路,气死爸爸了

2 最后证明,虽然并不明确strtol的函数中,中间参数的功能,但一般用起来还是没有问题的

3 把具体功能抽象成函数,有利于寻找错误

4 还发现了一中查错比较好的方法。把别人和自己的代码都放在coderunner的一个屏幕上,一个一个的实验数据,要相信一定会有问题的

5 关于极端情况的思考,这里面最长的一个数就是把16进制的十个F转换成2进制,会用40位,刚开始没有考虑周全