題目描述
求任意兩個不同進制非負整數的轉換(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;
}