PAT A1023 Have Fun with Numbers (20分)

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

题意:

输入一串大整数a,令b=a*2,判断a中所有出现的数字及其个数是否与b中所有出现的数字及其个数相同,如果相同输出Yes及b,否则输出No及b.

思路:

(1)开数组num[],num[i] 记录 i(0<=i<=9)在大整数中出现的次数;
(2)将数字字符串转化成大整数时取结果的每一位数字 i 进行num[i]++操作,当大整数与低精度整数相乘时取结果的每一位数字 i 进行num[i]- -操作,如果最终得出num[0]~num[9]都等于0则输出Yes,否则输出No.

代码:

#include <cstdio>
#include <cstring>

int num[10] = {0};//记录0-9出现的个数 

struct bign{//大整数 
	int d[25];
	int len;
	bign(){//构造函数,初始化结构体变量 
		memset(d,0,sizeof(d));
		len = 0;
	}
};

bign change(char str[]){//将数字字符串转化成大整数 
	bign a;
	int len = strlen(str);
	for(int i=0;i<len;i++){
		a.d[a.len++] = str[len-1-i]-'0';//大整数数组的低位存放数字字符串的低位 
		num[a.d[i]]++;//出现的数字加1 
	}
	return a;
}

bign multi(bign a,int b){//大整数与低精度整数乘法 
	bign c;
	int carry = 0;
	for(int i=0;i<a.len;i++){
		int temp = a.d[i]*b+carry;
		c.d[c.len++] = temp%10;
		num[temp%10]--;//出现的数字减1 
		carry = temp/10;
	}
	while(carry!=0){
		c.d[c.len++] = carry%10;
		num[carry%10]--;//出现的数字减1
		carry /= 10;
	}
	return c;
}

void print(bign a){//输出大整数 
	for(int i=a.len-1;i>=0;i--){
		printf("%d",a.d[i]);
	}
    printf("\n");
} 

int main(){
	char str[25];
	scanf("%s",str);
	bign a = change(str);
	bign b = multi(a,2);
	for(int i=0;i<10;i++){
		if(num[i]!=0){
			printf("No\n");
			print(b);
			return 0;
		}
	}
	printf("Yes\n");
	print(b);
	return 0;
}

词汇:

duplication 重复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值