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位,刚开始没有考虑周全