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) //有适合的除数
    {
        int i=0;
        while(division[i]==‘0‘)
            i++;
        strcpy(s,division+i);//比如49->07,那么下一轮s就变成7,多余的i个0都除掉
        return true;
    }
    else return false;
}

题目代码:

//贪心:除数从9到2来找就可以了,因为大于9的说明不存在
//input为个位数时,特殊处理即可
/*******高精度除法 bignum_div(x)***************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char s[1005];
char division[1005];//存储进行高精度除法的数据
int res[1005];//存储output数据

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) //有适合的除数
    {
        int i=0;
        while(division[i]==‘0‘)
            i++;
        strcpy(s,division+i);//比如49->07,那么下一轮s就变成7,多余的i个0都除掉
        return true;
    }
    else return false;
}

int main()
{
    while(~scanf("%s",s))
    {
        if(s[0]==‘-‘) break;

        int cnt=0;
        bool ok,no;
        no=false;
        int len=strlen(s);
        if(len<2)
        {
            printf("1%s\n",s);
            continue;
        }

        while(1)
        {
            ok=false;
            for(int i=9;i>1;i--)
            {
                if(bignum_div(i))
                {
                    ok=true;
                    res[cnt++]=i;
                    break;
                }
            }
            if(!ok)
            {
                if(strlen(s)>1)//找不到适合的除数,s又是两位数以上,如51=3x17,17为两位数,故51没有满足条件的答案
                    no=true;
                break;
            }
        }
        if(no)
            printf("There is no such number.\n");
        else
        {
            for(int i=cnt-1;i>=0;i--)
                printf("%d",res[i]);
            printf("\n");
        }
    }
    return 0;
}
时间: 2024-10-10 15:22:47

POJ 2325 Persistent Numbers#贪心+高精度除法的相关文章

【练习赛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

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

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

题意:我们可以把一个数A变成B=A的各位乘积,现在给出B,求是否可以有某个A通过计算得到B,有的话,是多少. 题解:贪心. 我们先分解B,若质因数有大于等于10的显然就不行了. 否则则一定可以把他的各因数排在一起成为A,使A的各位乘积=B. 贪心策略:把小数放前面. 注意: 一.不一定要质因数,10以内即可. 二.需要高精度. 三.A!=B 代码: #include <cstdio> #include <cstring> #include <algorithm> #de

poj 2635 The Embarrassed Cryptographer 筛素数+高精度除法

题意: 给K(<10^100),L(<10^6),求K小于L的最小素因子并输出,如果没有则输出GOOD. 分析: 枚举小于L的素数用高精度除法判断是否是因子,关键是怎么高效筛素数,先给一种比较慢的筛法: primes[max_prime_num],num=0; memset(vis,0,sizeof(vis)) for(int i=2;i<maxL;++i) if(vis[i]==0){ prime[num++]=i; for(int j=2*i;j<maxL;j+=i) vis[

【算法:1】高精度除法

高精度除法,我用高精度减法来模拟 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<string> using namespace std; inline int read() { int x=0,f=1;char ch=getchar();

poj 3252 Round Numbers 【推导&#183;排列组合】

以sample为例子 [2,12]区间的RoundNumbers(简称RN)个数:Rn[2,12]=Rn[0,12]-Rn[0,1] 即:Rn[start,finish]=Rn[0,finish]-Rn[0,start-1] 所以关键是给定一个X,求出Rn[0,X] 现在假设X=10100100  这个X的二进制总共是8位,任何一个小于8位的二进制都小于X 第一部分,求出长度为[0,7]区间内的二进制是RoundNumber的个数  对于一个长度为Len的二进制(最高位为1),如何求出他的Rou

中石油-高精度除法-java版

问题 G: [高精度]高精度数除以低精度数I 时间限制: 1 Sec  内存限制: 512 MB提交: 19  解决: 15[提交][状态][讨论版] 题目描述 修罗王聚集了庞大的暗元素以施展隐匿魔法,该魔法施展后将对其周边的时空产生隐匿效果,当然,隐匿的效果好坏取决于是否将暗元素平均地分配在其周边时空,显然这涉及高精度除法的编程.考虑到邪狼的理解能力,修罗王不得不先将问题简化为:输入一被除数(位数≤5000),输入一除数(整型数据范围内),输出整数商,忽略小数. 输入 共两行,第1行为一个数字

poj 2431 Expedition (贪心+优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6890   Accepted: 2065 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

POJ 3085 Quick Change (贪心)

Quick Change Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5801   Accepted: 4175 Description J.P. Flathead's Grocery Store hires cheap labor to man the checkout stations. The people he hires (usually high school kids) often make mistak