这题思路很简单啊,就是从小到大枚举全由1组成的数,直到找到第一个能被n整除的就是a,输出它的1的个数。
k基本可以认为就是那个全由1组成的数,c就是它包含的1的个数,枚举下一个k的方法就是k=k*10+1;,这能理解吧?因为:
11=1*10+1
111=11*10+1
1111=111*10+1
…………
a要能被n整除,至少a要大于等于n吧?所以第一个循环while(k<n),就是找到第一个大于等于n并且全由1组成的数。
然后如果k不能整除n,也就是while(k%n),就继续枚举咯。但是第二个循环中枚举下一个全由1组成的数用的是k=k%n*10+1;而不是k=k*10+1;,这是因为int存储的整数范围有限,一直k=k*10+1的话很快就会超过int的存储范围,由于k是否能整除n是使用取模操作来判断的,即k%n。
而取模操作有如下数学性质:
(a*b)%p=(a%p*b)%p (a+b)%p=(a%p+b)%p
具体证明过程这里不说了,想知道的话自己查资料。
那么(k%n*10+1)%n==(k*10+1)%n,由于题目中n<1w,k%n<1w,k%n*10+1<10w,所以用k=k%n*10+1能保证k永远在int的范围内,同时k%n==所枚举的那个全由1组成的数%n。