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;
    }
  • 相关阅读:
    jmeter解决乱码
    RedisTemplate方法详解
    linux centos7忘记密码?
    redis config 详解
    Spring Security使用详解(基本用法 )
    Oauth介绍
    springSecurity+Oauth2.0之授权模式(客户端、密码模式)
    springCloud Sleuth分布式请求链路跟踪
    spring cloud Stream消息驱动
    HttpServletResponse
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5224937.html
Copyright © 2011-2022 走看看