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;
    }
  • 相关阅读:
    android中ping命令的实现
    回溯法——求解0-1背包问题
    scanner使用中遇见的问题
    Eddy&#39;s digital Roots
    项目经理注意事项(3)---宏观把控
    Spring IOC容器
    C++对象模型——Template中的名称决议方式 (第七章)
    比赛对手名单
    猴子吃桃问题
    设计模式-单例模式(02)
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5224937.html
Copyright © 2011-2022 走看看