PAT A1023 Have Fun With Numbers 简单写法

题目链接

套路和简单思路总是会冲突,这道题明显可以用大整数乘法的套路来写,但是有点小题大做,因为只是将一个位数在20以内的数字乘上一个2而已。不复杂。

用大整数乘法的套路,需要有很多前戏,如下:

#include <cstdio>
#include <cstring>
struct bign{
	int d[1000];
	int len;
	bign(){
		memset(d,0,sizeof(d));
		len=0;
	}
};
bign change(char str[]){
	bign a;
	a.len=strlen(str);
	for (int i=0; i<a.len; i++){
		a.d[i]=str[a.len-1-i]-48;
	}
	return a;
}
void print(bign a){
	for (int i=a.len-1; i>=0; i--){
		printf("%d",a.d[i]);
	}
}
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;
		carry=temp/10;
	}
	while(carry){
		c.d[c.len++]=carry%10;
		carry/=10;
	}
	return c;
}
int isSameCon(bign a, bign b){
	if (a.len!=b.len){
		return 0;
	}else {
		int hashA[10]={0};
		int hashB[10]={0};
		for (int i=0; i<a.len; i++){
			hashA[a.d[i]]++;
			hashB[b.d[i]]++;
		}
		for (int i=0; i<10; i++){
			if (hashA[i]!=hashB[i]){
				return 0;
			}
		}
		return 1;
	}
}
int main(){
	char num1[30];
	scanf("%s",num1);
	bign big1=change(num1);
	if (isSameCon(big1,multi(big1,2))){
		printf("Yes\n");
	}else {
		printf("No\n");
	}
	print(multi(big1,2));
}

简单一点的思路, 如下:

#include <cstdio>
#include <cstring>
int isSameCon(char a[], char b[]){
	int hashA[10]={0};
	int hashB[10]={0};
	int lenA=strlen(a);
	int lenB=strlen(b);
	if (lenA!=lenB){
		return 0;
	}else {
		for (int i=0; i<lenA; i++){
			hashA[a[i]-'0']++;
			hashB[b[i]-'0']++;
		}
		for (int i=0; i<10; i++){
			if (hashA[i]!=hashB[i]){
				return 0;
			}
		}
		return 1;
	}
}
int main(){
	char num1[30];
	scanf("%s",num1);
	int len=strlen(num1);
	char num2[30];
	num2[len]='\0';
	int carry=0;
	for (int i=len-1; i>=0; i--){
		int temp=(num1[i]-48)*2+carry;
		num2[i+1]=temp%10+48;;
		carry=temp/10;
	}
	if (carry){
		num2[0]=carry+48;
		printf("No\n%s",num2);
	}else {
		if (isSameCon(num1, num2+1)){
			printf("Yes\n");
		}else {
			printf("No\n");
		}
		printf("%s",num2+1);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值