#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位,剛開始沒有考慮周全
新聞熱點
疑難解答