鱼C论坛

 找回密码
 立即注册
查看: 843|回复: 2

[已解决]求解,看不懂题,而且做不来

[复制链接]
发表于 2020-12-11 20:28:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
-             5 Have Fun with Numbers (20point(s))

Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!
Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.
Input Specification:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.
Output Specification:
For each test case, first print in a line "Yes" if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or "No" if not. Then in the next line, print the doubled number.

Sample Input:
1234567899

Sample Output:
Yes
2469135798
最佳答案
2020-12-11 23:00:58
请注意,数字123456789是一个9位数的数字,完全由1到9组成,没有重复。加倍,我们将得到246913578,它恰好是另一个9位数的数字,正好包含从1到9的数字,只是在不同的排列。如果我们再加倍看看结果!
现在,假设您要检查是否有更多具有此属性的数字。也就是说,用k个数字将一个给定的数字加倍,你要知道结果数字是否只由原始数字中的数字排列组成。
输入规格:
每个输入包含一个测试用例。每个案例包含一个不超过20位的正整数。
输出规格:
对于每个测试用例,如果将输入的数字加倍,则首先在一行中打印“Yes”,如果输入的数字仅由原始数字中的数字排列组成,则首先打印一行“No”。然后在下一行中,打印加倍的数字。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int digit[10]; //静态初始化数组,默认值为0
  4. int main()
  5. {
  6.         char ch[21];  //20个以内的数字(10位的数已经不是int了,用字符比较方便一点)
  7.         scanf("%s", ch);
  8.         int len = strlen(ch), num, i, flag = 0;
  9.         for (i = len - 1; i >= 0; i--)
  10.         {
  11.                 num = ch[i] - '0'; //char 转 int
  12.                 digit[num]++;
  13.                 num = num * 2 + flag; //flag是进制,x2后,进制可能会加一
  14.                 flag = 0;
  15.                 if (num >= 10)
  16.                 {
  17.                         num -= 10;
  18.                         flag = 1;
  19.                 }
  20.                 ch[i] = (num + '0'); //int 转 char
  21.                 digit[num]--;
  22.         }
  23.         int flag1 = 0; //优化输出
  24.         for (i = 0; i < 10; i++)
  25.         {
  26.                 if (digit[i] != 0)
  27.                 {
  28.                         flag1 = 1;
  29.                         break;
  30.                 }
  31.         }
  32.         printf("%s", (flag1 == 1) ? "No\n" : "Yes\n");
  33.         if (flag == 1)
  34.                 printf("1");// 若有进位,先输出1
  35.         printf("%s", ch);
  36.         return 0;
  37. }
复制代码


*************************************************
1234567899
Yes
2469135798
请按任意键继续 。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-11 22:11:36 | 显示全部楼层
本帖最后由 jitianmoshen 于 2020-12-11 22:20 编辑

题目就是一个数比如1234567899的 两倍是2469135798,这两个数都是由1-8每个数都用了一次,9用了两次,  让你检查输入的数是不是这样的数

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     long long num1, num2, num3;
  5.     int i, flag = 1;
  6.     long long nums1[10] = {0}, nums2[10] = {0};
  7.     printf("请输入一个数字:");
  8.     scanf("%lld", &num1);
  9.     num2 = num1 * 2;
  10.     num3 = num2;
  11.     while (num1)                              //把num1里面每个数字的个数保存到数组nums1里面
  12.     {
  13.         nums1[num1 % 10]++;
  14.         num1 /= 10;
  15.     }
  16.     while (num2)                              //把num2里面每个数字的个数保存到数组nums2里面
  17.     {
  18.         nums2[num2 % 10]++;
  19.         num2 /= 10;
  20.     }
  21.     for (i = 0; i <= 9;i++)                 //检测num1和num2每个数字的个数是否相同
  22.     {
  23.         if (nums1[i] != nums2[i])                  
  24.         {
  25.             flag = 0;
  26.             break;
  27.         }
  28.     }
  29.     if (flag)
  30.     {
  31.         printf("YES!\n");
  32.         printf("%lld\n",num3);
  33.     }
  34.     else
  35.         printf("NO!\n");     
  36.     return 0;
  37. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-11 23:00:58 | 显示全部楼层    本楼为最佳答案   
请注意,数字123456789是一个9位数的数字,完全由1到9组成,没有重复。加倍,我们将得到246913578,它恰好是另一个9位数的数字,正好包含从1到9的数字,只是在不同的排列。如果我们再加倍看看结果!
现在,假设您要检查是否有更多具有此属性的数字。也就是说,用k个数字将一个给定的数字加倍,你要知道结果数字是否只由原始数字中的数字排列组成。
输入规格:
每个输入包含一个测试用例。每个案例包含一个不超过20位的正整数。
输出规格:
对于每个测试用例,如果将输入的数字加倍,则首先在一行中打印“Yes”,如果输入的数字仅由原始数字中的数字排列组成,则首先打印一行“No”。然后在下一行中,打印加倍的数字。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int digit[10]; //静态初始化数组,默认值为0
  4. int main()
  5. {
  6.         char ch[21];  //20个以内的数字(10位的数已经不是int了,用字符比较方便一点)
  7.         scanf("%s", ch);
  8.         int len = strlen(ch), num, i, flag = 0;
  9.         for (i = len - 1; i >= 0; i--)
  10.         {
  11.                 num = ch[i] - '0'; //char 转 int
  12.                 digit[num]++;
  13.                 num = num * 2 + flag; //flag是进制,x2后,进制可能会加一
  14.                 flag = 0;
  15.                 if (num >= 10)
  16.                 {
  17.                         num -= 10;
  18.                         flag = 1;
  19.                 }
  20.                 ch[i] = (num + '0'); //int 转 char
  21.                 digit[num]--;
  22.         }
  23.         int flag1 = 0; //优化输出
  24.         for (i = 0; i < 10; i++)
  25.         {
  26.                 if (digit[i] != 0)
  27.                 {
  28.                         flag1 = 1;
  29.                         break;
  30.                 }
  31.         }
  32.         printf("%s", (flag1 == 1) ? "No\n" : "Yes\n");
  33.         if (flag == 1)
  34.                 printf("1");// 若有进位,先输出1
  35.         printf("%s", ch);
  36.         return 0;
  37. }
复制代码


*************************************************
1234567899
Yes
2469135798
请按任意键继续 。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 16:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表