原創:
之前有發一篇進制轉換的文章,轉換思想在里面,這里不再重復,詳情請查看:http://www.cnblogs.com/numen-fan/p/6495009.html
題目描述: 求任意兩個不同進制非負整數的轉換(2進制~16進制),所給整數在long所能表達的范圍之內。 不同進制的表示符號為(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。 輸入: 輸入只有一行,包含三個整數a,n,b。a表示其后的n 是a進制整數,b表示欲將a進制整數n轉換成b進制整數。a,b是十進制整數,2 =< a,b <= 16。 數據可能存在包含前導零的情況。 輸出: 可能有多組測試數據,對於每組數據,輸出包含一行,該行有一個整數為轉換后的b進制數。輸出時字母符號全部用大寫表示,即(0,1,...,9,A,B,...,F)。 樣例輸入: 15 Aab3 7 樣例輸出: 210306 提示: 可以用字符串表示不同進制的整數。
代碼:
//任何進制的轉換
void test3(){
//輸入格式,a,n,b;將a進制的n轉為b;
int a,b;
char str[40];//保存n
while (scanf("%d%s%d",&a,str,&b)!=EOF) {
int tmp = 0,lenth = strlen(str),c=1;//tmp表示將a進制數n轉為10進制,len為字符串n的長度,c為權重默認為1,最低位嘛,待會轉10進制時使用
for (int i = lenth-1; i>=0; i--) {
int x;
if (str[i]>='0'&&str[i]<='9') {
x = str[i]-'0';
}else if(str[i]>='a'&&str[i]<='z'){
x = str[i]-'a'+10;
}else if(str[i]>='A'&&str[i]>='Z'){
x = str[i]-'A'+10;
}
tmp+=x*c;//轉為10進制,乘權重
c*=a;//增加權重;
}
char ans[40],size = 0;
do{
int x = tmp%b;//將10進制轉為b進制
ans[size++] = x<10?x+'0':x-10+'A';//進行結果的裝填
tmp/=b;
}while(tmp);
// puts(ans);這里不能這樣用,因為ans為正確順序的倒着的
for(int i = size-1;i>=0;i--){
printf("%c",ans[i]);
}
printf("\n");
}
}