進位制轉換(大數)
問題 : 進位制轉換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;