求解,看不懂题,而且做不来
- 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 本帖最后由 jitianmoshen 于 2020-12-11 22:20 编辑
题目就是一个数比如1234567899的 两倍是2469135798,这两个数都是由1-8每个数都用了一次,9用了两次,让你检查输入的数是不是这样的数
#include <stdio.h>
int main(void)
{
long long num1, num2, num3;
int i, flag = 1;
long long nums1 = {0}, nums2 = {0};
printf("请输入一个数字:");
scanf("%lld", &num1);
num2 = num1 * 2;
num3 = num2;
while (num1) //把num1里面每个数字的个数保存到数组nums1里面
{
nums1++;
num1 /= 10;
}
while (num2) //把num2里面每个数字的个数保存到数组nums2里面
{
nums2++;
num2 /= 10;
}
for (i = 0; i <= 9;i++) //检测num1和num2每个数字的个数是否相同
{
if (nums1 != nums2)
{
flag = 0;
break;
}
}
if (flag)
{
printf("YES!\n");
printf("%lld\n",num3);
}
else
printf("NO!\n");
return 0;
} 请注意,数字123456789是一个9位数的数字,完全由1到9组成,没有重复。加倍,我们将得到246913578,它恰好是另一个9位数的数字,正好包含从1到9的数字,只是在不同的排列。如果我们再加倍看看结果!
现在,假设您要检查是否有更多具有此属性的数字。也就是说,用k个数字将一个给定的数字加倍,你要知道结果数字是否只由原始数字中的数字排列组成。
输入规格:
每个输入包含一个测试用例。每个案例包含一个不超过20位的正整数。
输出规格:
对于每个测试用例,如果将输入的数字加倍,则首先在一行中打印“Yes”,如果输入的数字仅由原始数字中的数字排列组成,则首先打印一行“No”。然后在下一行中,打印加倍的数字。
#include<stdio.h>
#include<string.h>
int digit; //静态初始化数组,默认值为0
int main()
{
char ch;//20个以内的数字(10位的数已经不是int了,用字符比较方便一点)
scanf("%s", ch);
int len = strlen(ch), num, i, flag = 0;
for (i = len - 1; i >= 0; i--)
{
num = ch - '0'; //char 转 int
digit++;
num = num * 2 + flag; //flag是进制,x2后,进制可能会加一
flag = 0;
if (num >= 10)
{
num -= 10;
flag = 1;
}
ch = (num + '0'); //int 转 char
digit--;
}
int flag1 = 0; //优化输出
for (i = 0; i < 10; i++)
{
if (digit != 0)
{
flag1 = 1;
break;
}
}
printf("%s", (flag1 == 1) ? "No\n" : "Yes\n");
if (flag == 1)
printf("1");// 若有进位,先输出1
printf("%s", ch);
return 0;
}
*************************************************
1234567899
Yes
2469135798
请按任意键继续 。。。
页:
[1]