題目描述 求任意兩個不同進制非負整數的轉換(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)。 樣例輸入 4 123 10 樣例輸出 27 提示 [+] *** 提示已隱藏,點擊上方 [+] 可顯示 *** 來源 2008年北京大學圖形實驗室計算機研究生機試真題 【思路】 [cpp] /********************************* * 日期:2013-2-19 * 作者:SJF0115 * 題號: 天勤OJ 題目1130: 數制轉換 * 來源:http://acmclub.com/problem.php?id=1130 * 結果:AC * 來源:2008年北京大學圖形實驗室計算機研究生機試真題 * 總結: **********************************/ #include <string.h> #include <stdio.h> char str[1001]; char ans[1001]; /* * 轉換為十進制 * str是a進制數字 */ long long int ToD(int a){ int c,len,i; long long int sum,w; len = strlen(str); //轉換為十進制的數字 sum = 0; //權值 w = 1; //從低位到高位遍歷每一個數字 for(i = len-1;i >= 0;i--){ //0 - 9 if(str[i] >= '0' && str[i] <= '9'){ c = str[i] - '0'; } //A - F else if(str[i] >= 'A' && str[i] <= 'F'){ c = str[i] - 'A' + 10; } //a - f else{ c = str[i] - 'a' + 10; } //累加該位數字和該位數字的權值的積 sum += c * w; //進制權值 w *= a; } return sum; } /* * 十進制數字num轉換為b進制數字,並用ans存儲 */ int ToAny(long long int num,int b){ int index = 0,c; do{ //計算該位數字 c = num % b; //將數字轉換為字符 ans[index++] = (c < 10) ? (c + '0') : (c - 10 + 'A') ; num /= b; }while(num); return index; } int main() { long long int c; int len,a,b,i; while(scanf("%d %s %d",&a,str,&b) != EOF){ //轉換為十進制 c = ToD(a); //轉換為b進制 len = ToAny(c,b); //輸出 for(i = len-1;i >= 0;i--){ printf("%c",ans[i]); } printf("\n"); } return 0; } /********************************* * 日期:2013-2-19 * 作者:SJF0115 * 題號: 天勤OJ 題目1130: 數制轉換 * 來源:http://acmclub.com/problem.php?id=1130 * 結果:AC * 來源:2008年北京大學圖形實驗室計算機研究生機試真題 * 總結: **********************************/ #include <string.h> #include <stdio.h> char str[1001]; char ans[1001]; /* * 轉換為十進制 * str是a進制數字 */ long long int ToD(int a){ int c,len,i; long long int sum,w; len = strlen(str); //轉換為十進制的數字 sum = 0; //權值 w = 1; //從低位到高位遍歷每一個數字 for(i = len-1;i >= 0;i--){ //0 - 9 if(str[i] >= '0' && str[i] <= '9'){ c = str[i] - '0'; } //A - F else if(str[i] >= 'A' && str[i] <= 'F'){ c = str[i] - 'A' + 10; } //a - f else{ c = str[i] - 'a' + 10; } //累加該位數字和該位數字的權值的積 sum += c * w; //進制權值 w *= a; } return sum; } /* * 十進制數字num轉換為b進制數字,並用ans存儲 */ int ToAny(long long int num,int b){ int index = 0,c; do{ //計算該位數字 c = num % b; //將數字轉換為字符 ans[index++] = (c < 10) ? (c + '0') : (c - 10 + 'A') ; num /= b; }while(num); return index; } int main() { long long int c; int len,a,b,i; while(scanf("%d %s %d",&a,str,&b) != EOF){ //轉換為十進制 c = ToD(a); //轉換為b進制 len = ToAny(c,b); //輸出 for(i = len-1;i >= 0;i--){ printf("%c",ans[i]); } printf("\n"); } return 0; }