将一个P进制的数转换为Q进制,需要分为两步:
一,将P进制数x转换为十进制数y:
int y=0,product=1;
while(x!=0){
y+=(x%10)*product;
x/=10;
product*=P;
}
二,将十进制数y转换为Q进制数z:
int z[20],num=0;
do{
z[num++]=y%Q;
y/=Q;
}while(y!=0);//这里用do...while的循环结构是用于处理y=0的特例
for(int i=num-1;i>=0;i--){//将所有余数倒着输出即得到z
printf("%d",z[i]);
}
输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数,输入的两个数相加后的结果可能会超过int和long的范围。
输入格式:一行中输入m,A,B,当m输入0时结束。
#include
int main(){
int m;
while((scanf("%d",&m)!=EOF)&&m!=0){
long a,b;
scanf("%lld%lld",&a,&b);
//scanf("%I64d%I64d",&a,&b);
long long c=a+b;
int num=0;
int arr[1000];
do{
arr[num++]=c%m;
c/=m;
}while(c!=0);
for(int i=num-1;i>=0;i--){
printf("%d",arr[i]);
}
printf("\n");
}
return 0;
}
一定注意若a和b使用int类型,则会导致结果出错。可以使用long类型也可以在加法运算时进行强制类型转换。
开始读错题目,以为a和b相加的结果超出long long类型的范围,采用下面这种比较复杂的做法,先分别将a和b进行进制转换,然后再把两个做加法得到最终结果。
#include
int main(){
int m,a,b;
scanf("%d",&m);
while(m!=0){
scanf("%d%d",&a,&b);
int ma[100]={},mb[100]={};
int na=0;
do{
ma[na++]=a%m;
a/=m;
}while(a!=0);
int nb=0;
do{
mb[nb++]=b%m;
b/=m;
}while(b!=0);
//m进制加法
int i;
for(i=0;i<na||i<nb;i++){
ma[i]+=mb[i];
if(ma[i]>=m){
ma[i]-=m;
ma[i+1]++;
}
}
if(ma[i]!=0)
printf("%d",ma[i]);
for(int j=i-1;j>=0;j--){
printf("%d",ma[j]);
}
printf("\n");
scanf("%d",&m);
}
return 0;
}
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。输出时符号用大写表示。
#include
#include
int main(){
int a,b;
char n[40];
while(scanf("%d%s%d",&a,n,&b)!=EOF){
int x=0,product=1;
int len=strlen(n);
for(int i=len-1;i>=0;i--){
int tmp;
if(n[i]>='0'&&n[i]<='9'){
tmp=n[i]-'0';
}
else if(n[i]>='a'&&n[i]<='z'){
tmp=n[i]-'a'+10;
}
else{
tmp=n[i]-'A'+10;
}
x+=tmp*product;
product*=a;
}
char y[40];
int num=0;
do{
int tmp=x%b;
if(tmp>=0&&tmp<=9){
y[num++]=tmp+'0';
}
else{
y[num++]=tmp+'A'-10;
}
x/=b;
}while(x!=0);
for(int i=num-1;i>=0;i--){
printf("%c",y[i]);
}
printf("\n");
}
return 0;
}
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
思路是将字符数组格式的十进制整数模拟竖式除以二的运算,每次除以二都将最后一个余数保存在结果数组中,直到字符数组全为0。倒着输出结果数组,即为转换后的二进制数。
#include
#include
int main(){
char str[40];
char zero[40];
while(scanf("%s",str)!=EOF){
int len=strlen(str);
int i;
for(i=0;i<len;i++){
zero[i]='0';
}
zero[i]='\0';
int num=0;//记录进行取余运算的次数 ;
int ans[100];
do{ //完成一次完整运算
int rem;//记录余数
int flag=0;
for(i=0;i<len;i++){//进行一次除以2的操作
int tmp=str[i]-'0';
if(flag==1)
tmp+=10;
str[i]=(tmp/2)+'0';
rem=tmp%2;
if(rem==1)
flag=1;
else
flag=0;
}
// for(i=0;i
// printf("%c",str[i]);
// }
// printf("\n");
ans[num++]=rem;
}while(strcmp(str,zero)!=0);
for(i=num-1;i>=0;i--){
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}
输入一个十进制数(整型范围内),输出其八进制。
过于简单。
#include
#include
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int ans[100];
int num=0;
do{
ans[num++]=n%8;
n/=8;
}while(n!=0);
for(int i=num-1;i>=0;i--){
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}