【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;
}
时间: 2024-11-07 08:00:45

【POJ2325】Persistent Numbers 贪心+高精度/低精度的相关文章

POJ 2325 Persistent Numbers#贪心+高精度除法

(- ̄▽ ̄)-* 这道题涉及高精度除法,模板如下: char s[1005]; char division[1005];//存储进行高精度除法的数据 bool bignum_div(int x) { int tot=0,num=0; for(int i=0;s[i];i++) { num=num*10+s[i]-'0'; division[tot++]=num/x+'0'; num%=x; } division[tot]='\0';//利于进行strcpy() if(num==0) //有适合的

【练习赛2补题】poj 2325 Persistent Numbers 【高精度除法+贪心】

Description The multiplicative persistence of a number is defined by Neil Sloane (Neil J.A. Sloane in The Persistence of a Number published in Journal of Recreational Mathematics 6, 1973, pp. 97-98., 1973) as the number of steps to reach a one-digit

ORACLE 中NUMBER 类型 低精度转换成高精度

例如: 表User中有一个字段 salary  Number(10,3), 如果想把字段salary的类型提高精度到salary  Number(10,6),保留六位小数, 解决办法:1,ALTER TABEL USER MODIFY SALARY NUMBER(13,6); 解释:number类型刚开始是,长度10位,3位小数,如果想增加3位小数,对应的长度也必须增加,否则无法修改.所以NUMBER(13,6);这样就可以提高精度了, ORACLE 中NUMBER 类型 低精度转换成高精度

网络游戏中的(低精度)时间同步

对于网络游戏来说,从物体的移动.攻击到最基础的计时等等,都需要客户端与服务器保持时间的相对一致,那么服务器与客户端同步便是一个必须要解决的问题.通常,网络游戏都会利用心跳来进行同步,那么当客户端并不需要如此精度的同步时,有没有其他方法呢?这里主要讨论低精度的时间同步(精确到秒). 工作中接触过3种简单的时间同步方法: 首先,定义时间同步类 /// 32位操作系统 typedef unsigned int64_t QWORD; typedef unsigned long DWORD; class

int类型被强制转换成较低精度的byte类型

公司的项目上线之前会进行代码合规性检查,其中很容易违反的一个规则就是“不要把原始类型转换成较低的精度”,实际开发的过程中,很多方法在处理数据时,尤其在做移位操作的时候,难免要把int类型转换成byte类型,这时候就不可避免得出现原始类型转换成较低精度的情况,没有什么简便的方法,只能通过调用ByteArrayOutputStream,DataOutputStream 来处理.把处理过程封装到一个函数中.然后在进行类型转化的时候调用函数.处理函数如下: public byte intToButeAr

[tem]高精度与低精度

1 //倒着存 B取的低精最大值所以简化了一点 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 const int N=1005,B=1e4,W=4,L=1005; 9 struct people{ 10 int a,b,t; 11 }p

[贪心][高精度][NOIP]国王游戏

题目梗概 有n个大臣,他们可以拿到他们之前所有人左手数的乘积除以他的右手,问是否能通过调换位置来使拿钱最多的大臣拿的钱最少. 思考 贪心证明: 设相邻的两个人$i, i + 1$.设$A[i] \times B[i] \leqslant  A[i + 1] B[i + 1]$,i之前所有人的左手乘积为S. 则,$ans1 = max \left (\frac{S}{B[i]} , \frac{S}{A[i] \times B[i+1]}  \right )$ 若交换 $ans2 = max \l

【NOIP2012提高组】国王游戏 贪心 + 高精度

题目分析 题目答案不具有单调性,所以不可以二分,转而思考贪心.因为无法确定位置,所以考虑如何才能让对于每一个$1 ~ i$使得$i$的答案最大,即$1 ~ i$最后一个最优.若设对于位置$i$,$a[i]$表示左手,$b[i]$表示右手,$S$为其前面所有人的左手之积,那么他的答案就是$\frac{S}{b[i]}$,如果存在在$i$后边的$j$的答案更优, 即$\frac{S * a[i]}{b[j]} > \frac{S * a[j]}{b[i]} => a[i] * b[i] >

poj 2325 Persistent Numbers

简单的贪心和高精度运算,主要还是要读懂题. #include"iostream" #include"stdio.h" #include"string" #include"string.h" #include"cmath" #define mx 5005 using namespace std; int cnt[15]; char num[mx]; char temp[mx]; bool div(int mo