Leetcode 1022.Smallest Integer Divisible by K.

题目描述(传送门)

Given a positive integer K, you need find the smallest positive integer N such that N is divisible by K, and N only contains the digit 1.
Return the length of N. If there is no such N, return -1.

Examples :

Input: 1
Output: 1
Explanation: The smallest answer is N = 1, which has length 1.

Input: 2
Output: -1
Explanation: There is no such positive integer N divisible by 2.

Input: 3
Output: 3
Explanation: The smallest answer is N = 111, which has length 3.

Note :

1 <= K <= 10^5

Code

1.先看大神的代码(传送门):

class Solution {
	public int smallestRepunitDivByK(int K) {
		for(int i=1,val=1; i<=K; i++){//为什么K是上限
			if(val % K == 0) return i;
			val = (val*10 + 1)%K;
		}    
		return -1;
	}
}

这题思路很简单,就是从1个1开始,一直遍历,判断能不能被K整除,整除就返回长度,不能整除就返回-1。但是上限呢?(有人说Integer.MAX_VALUE,那请继续向下看)为什么大神的上限是K?百思不得其解。看了下面这位大神的解释总算是明白了(传送门):
在这里插入图片描述

简单翻译一下:
很显然,如果K是2或者5的倍数,则N肯定不是K的倍数,因为N的个位是1(这句自己猜的,没看懂啥意思T_T)。因此返回-1。
如果K不是2的倍数,也不是5的倍数,有如下定理:

定理: 在K个数[1,11,111,1111,……,111……111(K个1)]中,记为L,必然有一个数是K的倍数。

为什么?我们用反证法证明一下:
假设L中不存在K的倍数,那么这K个数对K取余数后,必然存在两个数的余数相同,假设这两个数是N_i和N_j(N_i有i个1,N_j有j个1,i<j)。因此N_j-N_i=1111……0000……(j-i个1,i个0,记为c)=1111……(j-i个1,记为a)1000……(i个0,记为b)(c = ab)。因为N_i和N_j对K有相同的余数,所以N_j-N_i是K的倍数,也就是c是K的倍数。进一步推导出,由b不是K的倍数,所以a是K的倍数。矛盾产生,假设的是L中不存在K的倍数,但是a(1111(j-i个1))肯定是在L中的,所以假设不成立,原命题成立。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值