首页 > 代码库 > 【POJ2325】Persistent Numbers 贪心+高精度/低精度

【POJ2325】Persistent Numbers 贪心+高精度/低精度

题意:我们可以把一个数A变成B=A的各位乘积,现在给出B,求是否可以有某个A通过计算得到B,有的话,是多少。

题解:贪心。

我们先分解B,若质因数有大于等于10的显然就不行了。

否则则一定可以把他的各因数排在一起成为A,使A的各位乘积=B。

贪心策略:把小数放前面。

注意:

一、不一定要质因数,10以内即可。

二、需要高精度。

三、A!=B

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1005
using namespace std;
char s[N],t[N];
int bang[15],n;
bool div(int p)
{
	int i,x=0;
	memset(t,0,sizeof(t));
	for(i=1;i<=n;i++)
	{
		x=x*10+s[i];
		t[i]=x/p;
		x%=p;
	}
	if(!x)
	{
		for(x=1;t[x]==0;x++);x--;
		n-=x;
		for(i=1;i<=n;i++)s[i]=t[i+x];
		return 1;
	}
	else return 0;
}

int main()
{
//	freopen("test.in","r",stdin);
	int i;
	while(scanf("%s",s+1),s[1]!='-')
	{
		memset(bang,0,sizeof(bang));
		if(!s[2])
		{
			printf("1%c\n",s[1]);
			continue;
		}
		n=strlen(s+1);
		for(i=1;i<=n;i++)s[i]=s[i]-'0';
		for(i=9;i>1;i--)
		{
			while(div(i))
			{
				bang[i]++;
			}
		}
		if(n>1)printf("There is no such number.");
		else for(i=2;i<=9;i++)while(bang[i]--)printf("%d",i);
		puts("");
	}
	return 0;
}


【POJ2325】Persistent Numbers 贪心+高精度/低精度