pat 1023. Have Fun with Numbers

1,輸入的數最長有20位,即使用long long 類型 的數也不夠,所以用字符串處理

2,注意double之後數字位數變長一位的情況(5*2=10),即乘2算完之後進位標誌carry爲1,不要把最高位的數字忘了。


#include <iostream>
#include <string.h>
using namespace std;

int first[10],second[10];

void countDigits(char* a,int b[])
{
	int len=strlen(a);
	for(int i=0;i<len;i++)
	{
		int num = a[i]-'0';
		b[num]++;
	}
}


int main()
{
	freopen("E:/data/1023.txt","r",stdin);
	char num[22],num2[22];
	cin>>num;

	fill(first,first+10,0);
	fill(second,second+10,0);

	countDigits(num,first);
	int len=strlen(num);
	int carry=0,index=0;
	char temp[22];
	for(int i=len-1;i>=0;i--)
	{
		int digit=num[i]-'0',d2=0;
		digit=digit*2+carry;
		if(digit>9)
		{
			d2=digit%10;
			carry = digit/10;
		}
		else
		{
			carry =0;
			d2=digit;
		}
		char ch=(char)d2+'0';
		temp[index]=ch;
		index++;
	}
	if(carry>0)
	{
		char ch=(char)carry+'0';
		temp[index++]=ch;
		carry=0;
	}
	int p=0;
	for(int i=index-1;i>=0;i--)
	{
		num2[p]=temp[i];
		p++;
	}
	
	num2[index]='\0';
	if(index>len)
	{
		cout<<"No"<<endl<<num2<<endl;
		return 0;
	}
	countDigits(num2,second);
	int success=1;
	for(int i=0;i<10;i++)
	{
		if(first[i]!=second[i])
		{
			success=0;
		}
	}
	if(success==0)
		cout<<"No"<<endl;
	else
		cout<<"Yes"<<endl;
	cout<<num2<<endl;
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章