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


题意理解起来也有一定困难。
给一个数字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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值