转自:https://blog.csdn.net/qq_41505957/article/details/79514402
问题 : 进制转换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;