进制转换(大数)

转自: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的情况

 
  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.  
  12. sum=0;j=0;

  13. len=strlen(str);

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

  15. {

  16. printf("0\n");

  17. continue;

  18. }

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

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

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

  22. while(1)

  23. {

  24. answer=0;

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

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

  27. {

  28. answer=1;

  29. break;

  30. }

  31. if(answer==0)

  32. break;

  33. sum=0;

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

  35. {

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

  37. sum=sum%2;

  38. }

  39. ans[j++]=sum;

  40. point=0;

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

  42. {

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

  44. point=a[i]%2;

  45. a[i]/=2;

  46. }

  47.  
  48. }

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

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

  51. printf("\n");

  52. }

  53. return 0;

  54. }

 

另有一种简单的代码

 
  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;

  59.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值