00-自测4. 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 to9, 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


判断一个数乘2后是否是原数的一个排列 

思路: 
int最大值 2147483647  10位 
longlong 最大值 9223372036854775807  19位 

不满足题目20位  故不能数值型  只能字符串处理 
下面是进行long long 来进行操作的。

#include <iostream>
#include <math.h>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	int a[11]={0};
	int b[11]={0};
	int i=0,tmp=0;
	
//	cin>>a;
//	int len=strlen(a);
	long long int n=0,res=0;
	scanf("%lld",&n);
	res=n;
	while(n!=0)
	{
		a[n%10]++;
		n=n/10;
	}
	n=res*2;
	res=n;
	while(n!=0)
	{
		b[n%10]++;
		n=n/10;
	}
	for(i=0; i<10; i++)
	{
		if(a[i]!=b[i])
		{
			printf("No\n");
			printf("%lld",res);
			return 0;
		}
	}
	printf("Yes\n%lld\n",res);
	return 0;
}



不可以的呢,下面采用字符串的思路来解决。

解决的时候,应该注意cout<<string和cin>>string的问题。


#include <iostream>
#include <cstring>
#include <math.h>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAX 22

int main(int argc, char** argv) {
	//char a[MAX],b[MAX];
	string a,b;
	int ra[10]={0},rb[10]={0};
	
	cin>>a;
	int len=a.size(),carry=0,i=0;
	for(i=len-1;i>=0;i--)
	{
		ra[a[i]-'0']++;
		char c = ((a[i]-'0')*2+carry)%10 +'0';
		rb[c-'0']++;
		b=c+b;//!!!!
		carry=((a[i]-'0')*2+carry)/10;
	}
	if(carry != 0) b=(char)(carry+'0')+b;
	for(i=0; i<10;i++)
	{
		if(ra[i]!=rb[i])
		{
			cout<<"No\n"<<b;
			return 0;
		}
	}
	cout<<"Yes\n"<<b;

	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值