1. 程式人生 > >進位制轉換(大數)

進位制轉換(大數)

問題 : 進位制轉換1

時間限制: 1 Sec  記憶體限制: 32 MB
提交: 15  解決: 8
[提交][狀態]

題目描述

將一個長度最多為30位數字的十進位制非負整數轉換為二進位制數輸出。

輸入

多組資料,每行為一個長度不超過30位的十進位制非負整數。
(注意是10進位制數字的個數可能有30個,而非30bits的整數)

輸出

每行輸出對應的二進位制數。

樣例輸入

985
211
1126

樣例輸出

1111011001
11010011
10001100110

由於位數超出限制,所以要用大數,涉及大數除法和大數取餘,注意輸入為0的情況

  1. #include<stdio.h>

  2. #include<string.h>

  3. #define N 200

  4. int main()

  5. {

  6. int i,sum,j,len,answer,point;

  7. char str[N];

  8. int ans[N],a[N];

  9. while(scanf("%s",str)!=EOF)

  10. {

  11. sum=0;j=0;

  12. len=strlen(str);

  13. if(len==1&&str[0]=='0')

  14. {

  15. printf("0\n");

  16. continue;

  17. }

  18. for(i=0;i<len;i++)

  19. a[i]=str[i]-'0';

  20. memset(ans,0,sizeof(ans));

  21. while(1)

  22. {

  23. answer=0;

  24. for(i=0;i<len;i++)

  25. if(a[i]!=0)

  26. {

  27. answer=1;

  28. break;

  29. }

  30. if(answer==0)

  31. break;

  32. sum=0;

  33. for(i=0;i<len;i++)

  34. {

  35. sum=sum*10+a[i];

  36. sum=sum%2;

  37. }

  38. ans[j++]=sum;

  39. point=0;

  40. for(i=0;i<len;i++)

  41. {

  42. a[i]+=point*10;

  43. point=a[i]%2;

  44. a[i]/=2;

  45. }

  46. }

  47. for(j--;j>=0;j--)

  48. printf("%d",ans[j]);

  49. printf("\n");

  50. }

  51. return 0;

  52. }

另有一種簡單的程式碼

  1. #include<stdio.h>

  2. #include<string.h>

  3. int main()

  4. {

  5. char a[50],c[550];

  6. int ans[50];

  7. int i,j,k,n,len,sum;

  8. while(scanf("%s",a)!=EOF)

  9. {

  10. len=strlen(a);

  11. j=0;

  12. c[j]='0';

  13. sum=1;

  14. for(i=0;i<len;i++)

  15. ans[i]=a[i]-'0';

  16. while(sum)

  17. {

  18. sum=0;

  19. for(i=0;i<len;i++)

  20. {

  21. k=ans[i]/2;

  22. sum+=k;

  23. if(i==len-1)

  24. c[j++]=ans[i]%2+'0';

  25. else

  26. ans[i+1]+=ans[i]%2*10;

  27. ans[i]=k;

  28. }

  29. }

  30. for(j--;j>=0;j--)

  31. printf("%c",c[j]);

  32. printf("\n");

  33. }

  34. return 0;

  35. }

問題 : 進位制轉換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

提示

注意輸入時如有字母,則字母為大寫,輸出時如有字母,則字母為小寫。

  1. #include<stdio.h>

  2. #include<string.h>

  3. #define N 1020

  4. char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";

  5. int main()

  6. {

  7. int m,n,i,j,sum,len,point,answer;

  8. char ans[N],str[N];

  9. int a[N];

  10. while(scanf("%d%d",&m,&n)!=EOF)

  11. {

  12. memset(ans,0,sizeof(ans));

  13. memset(a,0,sizeof(a));

  14. scanf("%s",str);

  15. len=strlen(str);

  16. if(len==1&&str[0]=='0')

  17. {

  18. printf("0\n");

  19. continue;

  20. }

  21. for(i=0;str[i]!='\0';i++)

  22. {

  23. if(str[i]>='A'&&str[i]<='Z')

  24. a[i]=str[i]-'A'+10;

  25. else a[i]=str[i]-'0';

  26. }

  27. j=0;

  28. while(1)

  29. {

  30. answer=0;

  31. for(i=0;i<len;i++)

  32. if(a[i]!=0)

  33. {

  34. answer=1;

  35. break;

  36. }

  37. if(answer==0)

  38. break;

  39. sum=0;

  40. for(i=0;i<len;i++)

  41. {

  42. sum=sum*m+a[i];

  43. sum=sum%n;

  44. }

  45. ans[j++]=map[sum];

  46. point=0;

  47. for(i=0;i<len;i++)

  48. {

  49. a[i]+=point*m;

  50. point=a[i]%n;

  51. a[i]/=n;

  52. }

  53. }

  54. for(j--;j>=0;j--)

  55. printf("%c",ans[j]);

  56. printf("\n");

  57. }

  58. return 0;

  59. }

問題 : 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
  1. #include<stdio.h>

  2. #include<string.h>

  3. #define N 1020

  4. char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";

  5. int main()

  6. {

  7. int m,n,i,j,sum,len,point,answer;

  8. char ans[N],str[N];

  9. int a[N];

  10. while(scanf("%d%d",&m,&n)!=EOF)

  11. {

  12. memset(ans,0,sizeof(ans));

  13. memset(a,0,sizeof(a));

  14. scanf("%s",str);

  15. len=strlen(str);

  16. if(len==1&&str[0]=='0')

  17. {

  18. printf("0\n");

  19. continue;

  20. }

  21. for(i=0;str[i]!='\0';i++)

  22. {

  23. if(str[i]>='A'&&str[i]<='Z')

  24. a[i]=str[i]-'A'+10;

  25. else a[i]=str[i]-'0';

  26. }

  27. j=0;

  28. while(1)

  29. {

  30. answer=0;

  31. for(i=0;i<len;i++)

  32. if(a[i]!=0)

  33. {

  34. answer=1;

  35. break;

  36. }

  37. if(answer==0)

  38. break;

  39. sum=0;

  40. for(i=0;i<len;i++)

  41. {

  42. sum=sum*m+a[i];

  43. sum=sum%n;

  44. }

  45. ans[j++]=map[sum];

  46. point=0;

  47. for(i=0;i<len;i++)

  48. {

  49. a[i]+=point*m;

  50. point=a[i]%n;

  51. a[i]/=n;

  52. }

  53. }

  54. for(j--;j>=0;j--)

  55. printf("%c",ans[j]);

  56. printf("\n");

  57. }

  58. return 0;