Description
题目描述
求由最小的一个N,N个数码1组成的数能被M整除? 比如M=3时,111能被3整除。M=2时,则不存在这样的N。
输入
第一行是一个整数K(K≤1,000),表示样例的个数。 以后每行一个整数M(1≤M≤1,000,000)
输出
每行输出一个样例的结果,如果不存在这样的N,输出0。
样例输入
5 1 2 3 4 999989样例输出
1 0 3 0 473670
思路 :硬算,每次增加一个数码1,然后去试能否被整除。如m=3时,令x=1,1%3==1!=0,所以增加一个数码1,令x=x*10+1=11,
再计算x%m的值,直到可以被整除。
这里的坑在于如果单纯的这样计算,最后得出的x会非常非常非常大!!!所以还要想办法对x处理一下,即每次循环前都令x=x%n.
原理如下,还取上面的例子:
第三次循环的时候需要计算111%3的值,111%3=(11*10+1)%3=((11*10)%3+1%3)%3=((11%3)*10+1)%3.
这样处理一下就不会炸范围了!
这里用到的取余的运算规则,还是很重要的,贴一下。
运算规则
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
-
(a + b) % p = (a % p + b % p) % p (1)
-
(a - b) % p = (a % p - b % p) % p (2)
-
(a * b) % p = (a % p * b % p) % p (3)
-
a ^ b % p = ((a % p)^b) % p (4)
-
结合律:
((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)
-
交换律:
(a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
-
分配律:
(a+b) % p = ( a % p + b % p ) % p (9)
((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (10)
-
(a * c) ≡ (b * d) (%p); (13)
#include<stdio.h>
int main()
{
int k,n,m,p,c;
scanf("%d",&k);
while(k--)
{
scanf("%d",&m);
if(m%2==0&&m%5==0)//由数码1组成的数一定不能被2和5整除。
{
printf("0\n");
}
else
{
n=1,p=m,c=0;
while(p--)
{
n=n%m;
c++;
if(n==0)
break;
else
n=n*10+1;
}
if(n==0) printf("%d\n",c);
else printf("0\n");
}
}
return 0;
}
就这么短短几行代码,我想到秃头都想不出来,菜啊!
思路都想不到,更别提取余那一步了,不过现在又学会新的东西,吸吸w