进制转换问题
2018-02-12 14:00
225 查看
题型一:十进制-->n进制
九度1026 A+B
题目描述:输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。输入:输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。输出:输出格式:每个测试用例的输出占一行,输出A+B的m进制数。样例输入:
方法:先将a进制数看成字符串来保存,转化成十进制,再将十进制转换为b进制
九度1118
题目描述: 求任意两个不同进制非负整数的转换(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)。
样例输入:
方法:要模拟人工除法计算
九度1138
题目描述:
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入:
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出:
每行输出对应的二进制数。
样例输入: 0
1
3
8
样例输出:0
1
11
1000
九度1026 A+B
题目描述:输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。输入:输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。输出:输出格式:每个测试用例的输出占一行,输出A+B的m进制数。样例输入:
8 1300 48 2 1 7 0样例输出:
2504 1000
#include<stdio.h> int main(int argc, char* argv[]) { _int64 a,b; //注意:对于该题中231-1需要用long long或者_int64 //对应的依次是%lld和%I64d int n; while(scanf("%d %I64d %I64d",&n,&a,&b)!=EOF) { if(n==0) break; _int64 sum; sum=a+b; int buf[50]; int size=0; do{ buf[size++]=sum%n; sum/=n; }while(sum!=0); //关键!用do{}while形式确保输入为0时也有值 int i; for(i=size-1;i>=0;i--) //要倒序输出才是 { printf("%d",buf[i]); } printf("\n"); } return 0; }题型二:a进制-->b进制
方法:先将a进制数看成字符串来保存,转化成十进制,再将十进制转换为b进制
九度1118
题目描述: 求任意两个不同进制非负整数的转换(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提示:可以用字符串表示不同进制的整数。
#include<stdio.h> #include<string.h> int main(int argc, char* argv[]) { int a,b; char s[50]; while(scanf("%d %s %d",&a,s,&b)!=EOF) { int i; int x=1; //表示所在的位数 int ans=0; //表示转化后的十进制数 int len=strlen(s); /*将a进制数转化成十进制数*/ for(i=len-1;i>=0;i--) { int c; if(s[i]>='0'&&s[i]<='9') { c=s[i]-'0'; } if(s[i]>='A'&&s[i]<='F') { c=s[i]-'A'+10; } if(s[i]>='a'&&s[i]<='f') { c=s[i]-'a'+10; } ans+=c*x; x=x*a; } /*将十进制数转化成b进制数*/ int buf[50]; int size=0; do{ buf[size++]=ans%b; ans=ans/b; }while(ans!=0); /*输出b进制数*/ for(i=size-1;i>=0;i--) { printf("%d",buf[i]); } printf("\n"); } return 0; }题型三:大数(BIG integer)的进制转换
方法:要模拟人工除法计算
九度1138
题目描述:
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入:
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出:
每行输出对应的二进制数。
样例输入: 0
1
3
8
样例输出:0
1
11
1000
#include<stdio.h> #include<string> int main(int argc, char* argv[]) { char a[40]; int b[40]; int i; while(scanf("%s",a)!=EOF) { for(i=0;a[i]!=0;i++) { b[i]=a[i]-'0'; } int ans[40]; int j=0; while(1){ int temp=0; i=0; if(b[i]==0&&i<strlen(a)) i++; //处理前导0 if(i==strlen(a)) break; //当全是0的时候意味着已经处理到了结尾 /*模拟手算除法*/ for(;i<strlen(a);i++) { temp=10*temp+b[i]; b[i]=b[i]/2; temp=temp%2; //每次的余数即进位 } ans[j++]=temp; } if(j==0) printf("0\n"); else{ for(i=j-1;i>=0;i--) { printf("%d",ans[i]); } printf("\n"); } } return 0; }