Ones
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11696 | Accepted: 6594 |
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
开始以为这是一道水题,毕竟题目短。但我看了半天不知道题目想表达什么意思(结合题目给出的输入输出看懂的)。
首先我想到的是用long long型数据(害怕题目给一些大数据,先拿最大的数据类型试试水),然后每次进行n=n*10+1操作
,直到n能被它最开始的数据整除就跳出循环。下面是我的最开始的代码
#include <stdio.h>
int main()
{
long long n;
while(~scanf("%lld",&n))
{
int i;
long long t=n;
n=n*10+1;
for(i=1;n%t;i++)
n=n*10+1;
printf("%d\n",i);
}
return 0;
}
题目给出的样例运行起来没毛病,拿去提交试试。。。
果不其然,超时了。果然没那么简单,整理一下思维。n*10也是n的倍数所以没必要再做考虑,也就是说只需要判断1、11、111……
那些的了,换了一次代码,如下
#include <stdio.h>
int main()
{
long long n;
while(~scanf("%lld",&n))
{
int i;
long long t=1;
for(i=1;t%n;i++)
t=t*10+1;
printf("%d\n",i);
}
return 0;
}
同样,测试数据没毛病,去试试。。。
时间又超了。再回来测试我的代码吧,果不其然,输入了29就没结果了(按质数的从小到大的顺序输入的)。仔细算一算,29后面
跟的1太多了,超出long long的范围了,果然又是大数据。看来只考虑1还不行,得在每次运算后能缩小数据。后来想到了取余这
个运算,因为n*10已经是n的倍数了,所以不做考虑。然后再看例如第一个数据3,在后面加两个1后,11对3的余数是2,因为9+2
,9是3的倍数,再乘以10也是3的倍数,所以9就不用考虑了,只考虑他的余数2,后面的也进行这样的操作,这样一来数据的大小
被大大的缩小了于是有了下面这个代码
#include <stdio.h>
int main()
{
long long n;
while(~scanf("%lld",&n))
{
int i,t;
t=1;
for(i=1;t;i++)
{
t=t*10+1;
t%=n;
}
printf("%d\n",i);
}
return 0;
}
拿去提交,秒AC。。。
以后还得多见识这种题目,不然经验太少,提交错误后连怎么改都不知道。