时间限制: 1 Sec 内存限制: 32 MB
求任意两个不同进制非负整数的转换(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)。
用字符串存储和表示不同进制的数。
先把数字转成十进制,使用按权相加法;
再把十进制转成n进制,使用%n/n。
#include<iostream> #include<cstring> using namespace std; char x[1000]; char n[1000]; int main() { int a,b; while(cin>>a>>n>>b) { int size=0; long long temp=0; int c=1; for(int i=strlen(n)-1;i>=0;i--) { if('0'<=n[i]&&n[i]<='9') { temp+=((n[i]-'0'))*c; c*=a; } if('a'<=n[i]&&n[i]<='z') { temp+=((n[i]-'a'+10))*c; c*=a; } if('A'<=n[i]&&n[i]<='Z') { temp+=((n[i]-'A'+10))*c; c*=a; } } // while(n>0) // { // temp+=(n)*c; // c*=a; // n/=10; // } // cout<<temp<<endl; if(temp==0) { cout<<0<<endl; continue; } //36168 while(temp>0) { char c; if(temp%b<10) { c=temp%b+'0'; } else { c=temp%b-10+'A'; } x[size++]=c; temp/=b; } for(int i=size-1;i>=0;i--) { cout<<x[i]; } cout<<endl; } return 0; }