1、题目链接

https://www.patest.cn/contests/pat-a-practise/1023

2、题意分析

(1)题意:对于给出的一个数字A,我们乘以2得到2A,问数字A和数字2A是否包含相同数目的1-9。

(2)分析:使用大整数*int型数算法即可解决(使用C/C++语言)

3、源代码

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

#define size 30//数字共有20位 

int main(){
	int array1[10]={0},array2[10] = {0};//比较两个数的个数,大小 
	int array[size];
	int i,j ;
	 
	char string[size];//使用20位字符串
	scanf("%s",&string);//输入数字 	 
	
	int length = strlen(string);
		
	//12312378  ----> 87321321式存储,方便后面计算 
	int index = 0;//这里使用index作为下标【重要!!!】 
	for(i = length - 1 ;i >= 0 ;i--){
		array[index++] = string[i]-'0';//将各位存储到int型array[]中 
	}
	
	int flag = 0; //进位标志	 
	for(i = 0 ;i < length ; i++){
		array1[array[i]]++;//记录数字,个数 
		
		array[i] *= 2;
		array[i] += flag;//加进位 
		flag = array[i] /10;//产生进位 
		if(array[i] >= 10){			
			array[i] %= 10;//更新 
		}
	}
	if(flag>0)
	{
		array[length++] = flag;
		flag = 0;//重置 
	}
		
	for(i = 0;i < length;i++ ) {
		array2[array[i]] ++;//出现次数 	
	}
	
	//比较两个数组 ----> 要清楚虽然数字是从1—9,但是我们为啥也要比较0的原因 
	for(i = 0;i<=9;i++){
		if(array1[i] != array2[i]){
			break;
		}
	}
	
	
	if(i > 9){//如果没有遍历完--->不完全相等 
		printf("Yes\n");		 
	}
	else{
		printf("No\n");
	}
	for(i = length - 1;i >= 0 ;i--){
		printf("%d",array[i]);	
	} 	 	
}
/*
1234567899
5634567899
9999
9000000000000000000009
99999999
5
10122448866
325
300
*/
4、题目坑点

(1)审题:我们需要保证1-9这9个数字有着相同的数量,与此同时,如果位数不同也需要输出No,(注意:题目中明确告知原数列中没有0),所以得到的2A这个序列,我们也必须保证没有0。所以我们可以从0-9遍历即可。这个对应测试点2