Background
Special for beginners, ^_^
Description
请你编一程序实现两种不同进制之间的数据转换。
Format
Input
每行三个数,第一个数表示需要转换的数的进制n(2≤n≤16),第二个数是一个n进制数,若n>10则用大写字母A-F表示数码10-15,并且该n进制数的长度不超过30位,第三个数也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。
Output
转换后的n进制数,对于小数的转换,小数部分输出转换后的小数的前30个数字。
Samples
输入数据 1
16 FF 10
10 254 16
10 3.14 2
Copy
输出数据 1
255
FE
11.001000111101011100001010001111
Copy
Limitation
1s, 1024KiB for each test case.
思路:用while(cin)来输入三个参数,要转换的数和答案用string存储,遇到小数点在用别的变量转换,整数和小数先用__int128储存,后面再把两个数放到答案里.
Code
#include<bits/stdc++.h>
using namespace std;
int n,m,f;
__int128 a,b,d;
string s,ans,t="0123456789ABCDEF";
int main(){
while(cin>>n>>s>>m){//输入数据
ans="";
a=b=f=0;
d=1;
for(auto r:s){
if(r=='.'){
f=1;
continue;
}
if(f) b=b*n+t.find(r),d*=n;
else a=a*n+t.find(r);
}
if(a) for(;a;ans=t[a%m]+ans,a/=m);//进制转换
else ans="0";
if(b){//判断小数
ans+='.';
for(int i=0;i<30;i++){
cout<<t[b/d];
b*=m,ans+=t[b/d],b%=d;
}
cout<<endl;
}
cout<<ans<<endl;
}
return 0;
}
注:auto要在ISO c++ 11的编译环境里使用!
来学习.