您的位置:首页 > 其它

进制转换问题

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进制数。样例输入:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学问题