PTA刷题笔记(C语言) | 7-49 Have Fun with Numbers (20分)

喜欢ヅ旅行 2023-05-22 06:54 158阅读 0赞

开始刷题,感觉代码量和基础太渣了,导致数据结构不会,重头慢慢刷吧~
在这里插入图片描述


1、题目

在这里插入图片描述
Sample Input:

1234567899

Sample Output:

Yes
2469135798


译文:

注意,编号123456789是一个9位数字,由1到9之间的数字组成,没有重复。加倍我们将得到246913578,这恰好是另一个9位数的数字,由1到9的数字组成,只是排列不同。如果我们再加倍检查一下结果!

现在您应该检查这个属性是否有更多的数字。也就是说,把一个给定的数字乘以两倍,再加上k个数字,你就可以知道得到的数字是否只由原始数字中的数字排列而成。

输入规格:

每个输入包含一个测试用例。每个大小写包含一个不超过20位的正整数。

输出规格:

对于每一个测试用例,如果输入的数字加倍,则第一次在“是”行中打印一个数字,该数字仅由原始数字中的数字排列而成,否则为“否”。然后在下一行中,打印加倍的数字。


2、代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main (){
  4. char start[21];
  5. char end[21];
  6. gets(start); //输入数
  7. int t,i,j,m=0,s;
  8. t=strlen(start); //存入数的长度即位数
  9. int flag1=1;
  10. //第一位数字大于5要进位,字符运算
  11. if((start[0]-'0')*2>=10){
  12. end[0]='1'; //乘2进位只可能为1
  13. flag1=0; //位数改变则表明一定不同
  14. }
  15. //从末尾开始做乘法
  16. for(i=t-1; i>=0; i--){
  17. //有进位
  18. if((start[i]-'0')*2>=10){
  19. s=(start[i]-'0')*2%10+m;
  20. end[i+1]='0'+s;
  21. m=1; //进位存储
  22. }
  23. //无进位
  24. else{
  25. s=(start[i]-'0')*2+m;
  26. end[i+1]='0'+s;
  27. m=0;
  28. }
  29. }
  30. int flag=1;
  31. //在end数组中遍历,若存在两数相等,则在start数组中将此数变为a
  32. for(i=1; i<=t; i++){
  33. for(j=0; j<t; j++){
  34. if(end[i]==start[j]){
  35. start[j]='a';
  36. break;
  37. }
  38. }
  39. }
  40. //若start数组中不全为a,则证明有不同的数产生
  41. for(i=0; i<t; i++){
  42. if(start[i]!='a'){
  43. flag=0;
  44. break;
  45. }
  46. }
  47. if(flag==1)
  48. printf("Yes\n");
  49. else
  50. printf("No\n");
  51. if(flag1==0){
  52. //进位后输出从第一位开始
  53. for(i=0; i<=t; i++){
  54. printf("%c",end[i]);
  55. }
  56. }
  57. else{
  58. //无进位从第二位开始
  59. for(i=1; i<=t; i++){
  60. printf("%c",end[i]);
  61. }
  62. }
  63. return 0;
  64. }

在这里插入图片描述

3、讨论

这个题,由于限制是不超过20位的数字,若采用整形会造成越界问题,别问我怎么知道的,试出来的,哈哈,所以采用字符数组来存储大数并模拟大数的乘2运算。

由于只是乘2运算,进位不是那么复杂,可以只在存储数组前空出一位方便进位即可。

先保存最开始的第一位进位,然后正常计算,如果乘2之后大于等于10,那么进1,否则,不进。

妙啊!!!
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,158人围观)

还没有评论,来说两句吧...

相关阅读