POJ 2551 Ones(我的水题之路——重点,末尾有几个1)

Ones
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9058   Accepted: 5139

Description

Given any integer 0 <= n <= 10000 not divisible by 2 or 5, some multiple of n is a number which in decimal notation is a sequence of 1's. How many digits are in the smallest such a multiple of n?

Input

Each line contains a number n.

Output

Output the number of digits.

Sample Input

3 
7 
9901

Sample Output

3
6
12

Source

Waterloo local 2001.06.02

题意理解起来也有一定困难。
给一个数字n,问,在其末尾加上多少个1,可以被n本身整除,如:3,加上3个1,为3111可以被3整除;7,加上7个1,为71111111.

这道题很难想,说实话不算水题,看到末尾加1,首先想到的是高精度,甚至想好了用java,之后用了long long暴力试了试,果然范围不够- -,其实想想也知道,之后看了discuss才知道正确解法,在这里向大牛致敬。

将一个数取下来,然后从1对n本身取模(%),之后将取模之后的数字乘以10加1,再取模,直到取模为0.
请先看下面的代码,在这里我做解释。
如n=3. 结果为3111.
   第一次,第一个1加上为 31 = 30 + 1, 其中30可以被3整除,所以之后的计算,我们仅需要考虑1即可。
   第二次,我们对1后面加上一个1,为1 * 10 + 1 = 11 = 9 + 2.其中9可以被3整除,需要对2末尾加1,再整除3即可。
   第三次,我们对2后面加上一个1,为21可以整除3,循环结束。
   所以我们一共在n末尾加上了三个1.输出3.

注意点:
1)由这里,整理一个规律(可能已经有定理了= =):就是说一个大数,如果要对于它进行操作然后取整,可以先对其取模,之后再对于其余数进行后续处理。

代码(1AC):
#include <cstdio>
#include <cstdlib>
#include <cstring>

int main(void){
    int num;
    int n;
    int i, j;

    while (scanf("%d", &n) != EOF){
        num = i = 1;
        num %= n;
        for (; num; i++){
            num = num * 10 + 1;
            num %= n;
        }
        printf("%d\n", i);
    }
    return 0;
}


你可能感兴趣的:(java,Integer,input,output)