很郁悶,這道題一直WA,然而本地我測了好幾組數據都是通過的,上網找了網友陳宇龍加油加油加油的AC的代碼,http://blog.csdn.net/Since_natural_ran/article/details/51742149,發現沒有什么不同。。。很無語。。
#include<stdio.h>
#include<string.h>
#include<math.h> int main() { char input[10005]; int i,temp,length,Case; scanf("%d",&Case); while(Case--){ scanf("%s",input); length = strlen(input); temp = length%4; int sum = 0; if(temp) //巧妙地處理了余數位 { for(i = 0;i < temp; i++) sum += (input[i] - '0')*pow(2,temp - 1 - i); //注意函數 printf("%X",sum); } for(i = temp;i < length; i += 4) //注意 i 必須要賦值 printf("%X",(input[i] - '0')*8 + (input[i+1] - '0')*4 + (input[i+2] - '0')*2 + (input[i+3] - '0')); printf("\n"); } return 0; }
#include <stdio.h>
#include <string.h>
#include <math.h>
char bin[10001]={0};
int main()
{
int n;
char hex16[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
scanf("%d",&n);
while(n--){
scanf("%s",bin);
int l=strlen(bin);
for(int i=0;bin[i]!='\0';i++){
bin[i]-=0x30;
}
char hex[2510]={0};
int rem=l%4;
int i,j,tmp=0;
if(rem!=0){
for(i=0;i<rem;i++){
tmp+=bin[i]*pow(2,rem-i-1);
}
hex[0]=hex16[tmp];
}
else{
hex[0]=hex16[bin[0]*8+bin[1]*4+bin[2]*2+bin[3]*1];
i=4;
}
if(l>4){
for(j=1;bin[i+4]!='\0';i+=4,j++){
hex[j]=hex16[bin[i]*8+bin[i+1]*4+bin[i+2]*2+bin[i+3]*1];
}
hex[j]=hex16[bin[i]*8+bin[i+1]*4+bin[i+2]*2+bin[i+3]*1];hex[j+1]='\0';
}
printf("%s\n",hex);
}
return 0;
}
這是我的代碼。思路完全一樣,然而就是WA。。。
不過上面那位仁兄代碼寫得很不錯,學習了。
?
*************************************************************************
睡了一覺,醒來發現自己犯了一個愚蠢的錯誤:由于自己已經把輸入字符串去“ASCII”化了,這樣就不能用bin[i+4]!='\0';來判斷字符串結束了!因為0的ASCII碼就是‘\0’!之前測的用例對是因為沒有走到過這個條件!!!
思維不嚴謹啊~這回知道了,還是用字符串的長度判斷比較靠譜.........
?而且,對于字符串不要去“ASCII”化,而是像上面那位仁兄一樣,用
(input[i] - '0')這種形式比較好!