目录
进制转换
又一版A+B
百练POJ2710:数制转换
百练POJ3249 进制转换
八进制
进制转换其实就是一种较为特殊的数位拆解。
问题:数字a从m进制转换成n进制
步骤:①从m进制转成十进制
②从十进制转成n进制
题目链接:https://www.nowcoder.com/practice/9255c05d45b8406c9b588d7c57aa920b?tpId=40&tqId=21466&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
题目描述
输入两个不超过整型定义的非负10进制整数A和B(<=2^31-1),输出A+B的m (1 < m <10)进制数。
输入描述:
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
输出描述:
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
示例1
输入
8 1300 48
2 1 7
0
输出
2504
1000
AC代码:
#include
using namespace std;
int main(){
int m;
long long A,B,C;
while(cin>>m){
if(m==0) break;
cin>>A>>B;
C=A+B;
//将C转换成m进制
int ans[20],size=0;
do{
ans[size++]=C%m;
C=C/m;
}while(C!=0);
for(int i=size-1;i>=0;i--){
cout<
题目链接:http://bailian.openjudge.cn/practice/2710/
2710:数制转换
总时间限制:
1000ms
内存限制:
65536kB
描述
求任意两个不同进制非负整数的转换(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
AC代码:
#include
#include
using namespace std;
int main(){
int a,b; //a进制转成b进制
//输入可能有前导0
char str[100];
while(cin>>a>>str>>b){
//先把a进制的转换成十进制
int length=strlen(str);
int ans1=0; //10进制的
int p=1;
for(int i=length-1;i>=0;i--){
int tmp;
if(str[i]>='0' && str[i]<='9'){
tmp=(str[i]-'0')*p;
ans1+=tmp;
}
else if(str[i]>='a' && str[i]<='z'){
tmp=(str[i]-'a'+10)*p;
ans1+=tmp;
}
else if(str[i]>='A' && str[i]<='Z'){
tmp=(str[i]-'A'+10)*p;
ans1+=tmp;
}
p=p*a;
}
//十进制转成b进制
int ans2[20],size=0;
do{
ans2[size++]=ans1%b;
ans1=ans1/b;
}while(ans1!=0);
//倒序输出
for(int i=size-1;i>=0;i--){
if(ans2[i]>=10){
char c=ans2[i]-10+'A';
cout<
题目链接:http://bailian.openjudge.cn/practice/3249/
3249:进制转换
总时间限制:
1000ms
内存限制:
65536kB
描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
0
1
3
8
样例输出
0
1
11
1000
题目理解:这需要用到大整数除法,就是在除数不为0 的时候一直循环地计算相应位的余数,就像那个列竖式算除以2的余数一样
AC代码 ,注意考虑数组的大小
10^30 大约 2^100次方左右
#include
#include
using namespace std;
char str[200];
int tmp[200];
int ans[200]; //最后余数
int main(){
while(cin>>str){
int len=strlen(str);
for(int i=0;i=0;i--){
cout<
题目链接:https://www.nowcoder.com/practice/eda051c1effc4dffa630bc8507f0c5f7?tpId=40&tqId=21562&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
题目描述
输入一个整数,将其转换成八进制数输出。
输入描述:
输入包括一个整数N(0<=N<=100000)。
输出描述:
可能有多组测试数据,对于每组数据,
输出N的八进制表示数。
示例1
输入
7
8
9
输出
7
10
11
题目理解:应该是一个非常简单的进制转换的问题,也没有大数的问题。
AC代码:
#include
#include
using namespace std;
int N;
int ans[50];
int num;
int main(){
while (cin>>N) {
//10进制转换成8进制
num = 0;
memset(ans, 0, sizeof(ans));
do {
ans[num++] = N % 8;
N = N / 8;
} while (N != 0);
for (int i = num - 1; i >= 0; i--) {
cout << ans[i];
}
cout << endl;
}
return 0;
}