pat 1023

本文介绍了一个编程问题:检查一个给定的数字,在将其翻倍之后,所得的新数字是否仅由原数字的位数重新排列组成。文章提供了一段C语言代码实现,该程序能够接收一个不超过20位的正整数作为输入,并判断翻倍后的数字是否满足题目要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1023. Have Fun with Numbers (20)

时间限制
400 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 file 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


#include <stdio.h>
#include <string.h>

char str[25];
int num[10], ans[25], num1[10];

int main()
{
	int i = 0, tmp, j;

	while(scanf("%s", str) != EOF)
	{
		memset(num, 0, sizeof(num));
		memset(ans, 0, sizeof(ans));
		memset(num1, 0, sizeof(num1));

		int len = strlen(str);

		for(i = 0; i < len; i++)
				num[str[i] - '0']++;

		for(i = len - 1, j = 0; i >= 0; i--, j++)
		{
				int tmp = str[i] - '0';
				tmp = 2 * tmp;
				ans[j] = tmp;
		}

		for(i = 0; i < j; i++)
		{
			if(ans[i] >= 10)
			{
				ans[i] = ans[i] % 10;
				ans[i+1]++;
			}
		}

		if(ans[i] == 0)
			i--;

		for(j = 0; j <= i; j++)
		{
			num[ans[j]]--;
		}

		for(i = 0; i < 10; i++)
			if(num[i] != 0)
				break;

		if(i < 10)
			printf("No\n");
		else
		{
			printf("Yes\n");
		}
		for(i = j - 1; i >= 0; i--)
			printf("%d", ans[i]);
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值