进制转换(大数)
问题 : 进制转换1
时间限制: 1 Sec 内存限制: 32 MB提交: 15 解决: 8
[提交][状态]
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985
211
1126
样例输出
1111011001
11010011
10001100110
由于位数超出限制,所以要用大数,涉及大数除法和大数取余,注意输入为0的情况
#include<stdio.h>
#include<string.h>
#define N 200
int main()
{
int i,sum,j,len,answer,point;
char str[N];
int ans[N],a[N];
while(scanf("%s",str)!=EOF)
{
sum=0;j=0;
len=strlen(str);
if(len==1&&str[0]=='0')
{
printf("0\n");
continue;
}
for(i=0;i<len;i++)
a[i]=str[i]-'0';
memset(ans,0,sizeof(ans));
while(1)
{
answer=0;
for(i=0;i<len;i++)
if(a[i]!=0)
{
answer=1;
break;
}
if(answer==0)
break;
sum=0;
for(i=0;i<len;i++)
{
sum=sum*10+a[i];
sum=sum%2;
}
ans[j++]=sum;
point=0;
for(i=0;i<len;i++)
{
a[i]+=point*10;
point=a[i]%2;
a[i]/=2;
}
}
for(j--;j>=0;j--)
printf("%d",ans[j]);
printf("\n");
}
return 0;
}
另有一种简单的代码
#include<stdio.h>
#include<string.h>
int main()
{
char a[50],c[550];
int ans[50];
int i,j,k,n,len,sum;
while(scanf("%s",a)!=EOF)
{
len=strlen(a);
j=0;
c[j]='0';
sum=1;
for(i=0;i<len;i++)
ans[i]=a[i]-'0';
while(sum)
{
sum=0;
for(i=0;i<len;i++)
{
k=ans[i]/2;
sum+=k;
if(i==len-1)
c[j++]=ans[i]%2+'0';
else
ans[i+1]+=ans[i]%2*10;
ans[i]=k;
}
}
for(j--;j>=0;j--)
printf("%c",c[j]);
printf("\n");
}
return 0;
}
问题 : 进制转换2
时间限制: 1 Sec 内存限制: 32 MB提交: 31 解决: 11
[提交][状态]
题目描述
将M进制的数X转换为N进制的数输出。
输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出
输出X的N进制表示的数。
样例输入
10 2
11
样例输出
1011
提示
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
#include<stdio.h>
#include<string.h>
#define N 1020
char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";
int main()
{
int m,n,i,j,sum,len,point,answer;
char ans[N],str[N];
int a[N];
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
scanf("%s",str);
len=strlen(str);
if(len==1&&str[0]=='0')
{
printf("0\n");
continue;
}
for(i=0;str[i]!='\0';i++)
{
if(str[i]>='A'&&str[i]<='Z')
a[i]=str[i]-'A'+10;
else a[i]=str[i]-'0';
}
j=0;
while(1)
{
answer=0;
for(i=0;i<len;i++)
if(a[i]!=0)
{
answer=1;
break;
}
if(answer==0)
break;
sum=0;
for(i=0;i<len;i++)
{
sum=sum*m+a[i];
sum=sum%n;
}
ans[j++]=map[sum];
point=0;
for(i=0;i<len;i++)
{
a[i]+=point*m;
point=a[i]%n;
a[i]/=n;
}
}
for(j--;j>=0;j--)
printf("%c",ans[j]);
printf("\n");
}
return 0;
}
问题 : 10进制 VS 2进制
时间限制: 1 Sec 内存限制: 32 MB提交: 6 解决: 5
[提交][状态]
题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入
一个1000位(即10^999)以内的十进制数。
输出
输入的十进制数的二进制逆序数。
样例输入
985
样例输出
623
#include<stdio.h>
#include<string.h>
#define N 1020
char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";
int main()
{
int m,n,i,j,sum,len,point,answer;
char ans[N],str[N];
int a[N];
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
scanf("%s",str);
len=strlen(str);
if(len==1&&str[0]=='0')
{
printf("0\n");
continue;
}
for(i=0;str[i]!='\0';i++)
{
if(str[i]>='A'&&str[i]<='Z')
a[i]=str[i]-'A'+10;
else a[i]=str[i]-'0';
}
j=0;
while(1)
{
answer=0;
for(i=0;i<len;i++)
if(a[i]!=0)
{
answer=1;
break;
}
if(answer==0)
break;
sum=0;
for(i=0;i<len;i++)
{
sum=sum*m+a[i];
sum=sum%n;
}
ans[j++]=map[sum];
point=0;
for(i=0;i<len;i++)
{
a[i]+=point*m;
point=a[i]%n;
a[i]/=n;
}
}
for(j--;j>=0;j--)
printf("%c",ans[j]);
printf("\n");
}
return 0;
}