zoukankan      html  css  js  c++  java
  • 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]='';//利于进行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]='';//利于进行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
    ",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.
    ");
            else
            {
                for(int i=cnt-1;i>=0;i--)
                    printf("%d",res[i]);
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5224937.html
Copyright © 2011-2022 走看看