zoukankan      html  css  js  c++  java
  • poj1426 Find The Multiple(c语言巧解)

    Find The Multiple
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 36335   Accepted: 15194   Special Judge

    Description

    Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal digits.

    Input

    The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input.

    Output

    For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits. If there are multiple solutions for a given value of n, any one of them is acceptable.

    Sample Input

    2
    6
    19
    0

    Sample Output

    10
    100100100100100100
    111111111111111111
    ----------------------------------------------------------------------------------------------------------------------
    关于我的想法

    很多同学的算法是在结果不超过long long的取值范围的情况下得到的答案,而题目却说可能存在100位的数,明显大部分同学利用了这个题目的漏洞解出这个题目

    下面我介绍一种每个输出都为100位数的方法,先用深度搜索,创建一个只含0和1的数组,再用check()函数检查这个数组是不是可以除尽n,可以则为结果

    关于check()
    将数组从99到0分别提取出来,再加上上一位残留的余数*10,模n,余数存起来留给下一位,直到0位的时候余数为0,也就是除尽了。

    这个检查函数的原理与我们自己手写算一个数除以另一个数类似,最后一位除尽,表示这个数可以除尽。
    #include <stdio.h>
    #include <stdlib.h>
    int len[110],n,bo;
    int check()//检查数组是否可以除尽
    {
        int i,y=0;
        for(i=99;i>=0;i--)
           y=((len[i]+y)%n)*10;
        if(y==0)//余数为零
           return 1;
        else
           return 0;
    }
    int dfs(int x)
    {
        int i;
        if(bo)return;//得到了结果
        if(x<0)//到了数组的底
        {
             if(check())
                bo=1;
             return;
        }
        for(i=1;i>=0;i--)//从1到0计算更快,否则容易超时
        {
            if(bo)return;//得到了结果
            len[x]=i;
            dfs(x-1);
        }
    }
    int main()
    {
        int i;
        while(scanf("%d",&n)==1&&n)
        {
            bo=0;
            dfs(99);
            for(i=99;i>=0;i--)
                 printf("%d",len[i]);
            printf("
    ");
        }
       return 0;
    }



  • 相关阅读:
    Asp.net routing vs Url rewriting
    How to combine WCF Route and MVC Route to work together.
    Servlets beat CGI
    What if you encounter a problem when consume your WCF service ? How to Diagnostic it ?
    uva 4965 Sum the Square
    zoj 3633 Alice's present
    4966 Normalized Form
    ZOJ 3015 Collision Ball Game
    二分图 最小路径覆盖
    uva 2696 Air Raid
  • 原文地址:https://www.cnblogs.com/carcar/p/8310959.html
Copyright © 2011-2022 走看看