原题链接:题目详情 - L1-7 装睡 (10 分) (pintia.cn)
这道题乍一看真的很难,一看就是那种不需要你一步一步去分解题目,然后找到每一个地方的的基础算法解决这个问题。而是你需要找到一种关系,一种需要你去思考的巧妙方法才能解决这道问题;
很不幸,最开始看到这道题的时候我是完全没有任何思路的,但是经过我的思考后发现一个问题,我们这里需要求得是一个非常大非常大的数,当然,开longlong肯定不行,大整数思想里面也没有提供除法的思路,那要如何做呢?
这是我发现了一个关键点,整除;
也就是说,不管我们的1111...有多长,最后的这个数肯定是能整除我们给出的k的,我在一步一步尝试中发现,我们可以不用一开始就把所有的1给出来;
比如k=31的时候,第一个能被除的全一的数是111,模完之后,不管余数是多少,在这个数后面加上一个一就又可以成为被除数了,但是有时候可能需要加11才行,不过问题不大,我们每一步只需要让它模上k,只要不为零,我们就在后面给它填上一个1,把统计1的个数加加即可。
当我们这里出现模完之后为零的情况时,说明已经除尽了,可以输出了;
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int k=1;
int ans=1;
while(1)
{
if(k/n!=0)
break;
k=k*10+1;
ans++;
}//首先找到第一个可以成为被除数的数 ,这里当n=31时, k为111
//其实这一步写在这里和写在下面没区别,但是会出现k除以n等于0的前导零情况
//我们的答案不需要前导零,所以这里的结果可能影响到答案,所以需要加这一步
while(1)
{
int flag=k%n;
cout<<k/n;
k%=n;
if(k==0)
break;
k=k*10+1;
ans++;
}//只需要一步一步循环即可。答案会在每一步输出
cout<<' '<<ans;
}