1223 Repeat One

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.

这样处理一下就不会炸范围了!

这里用到的取余的运算规则,还是很重要的,贴一下。

运算规则

模运算与基本四则运算有些相似,但是除法例外。其规则如下:

  1. (a + b) % p = (a % p + b % p) % p (1)

  2. (a - b) % p = (a % p - b % p) % p (2)

  3. (a * b) % p = (a % p * b % p) % p (3)

  4. 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

 

  • 17
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值