这道题的解题过程真是一波三折,也真是发现人外有人,天外有天,好多神人真是。
原题如下图,也可点击这个链接到原题自己测试光棍原题链接:
一开始做的时候的想法:so easy,虽然看到了题目中提示s可能超级大 ,直接做可能超时,但是当时也没别的想法只能硬着头皮上了,果然,哈哈,超时了,只砍下14分,说实话,这14分都感觉像运气。
这是当初的代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
long long int num=11;
int count=2;
cin>>n;
while(num%n!=0)
{
num=num*10+1;
count++;
}
cout<<num/n<<" "<<count<<endl;
}
辗转各位神人的题解,真是让我大开眼界,最终也是有了自己的算法,还算是不错。
注释,我给附到代码里了,可以自己复制到自己的编译环境里,看一下,感觉CSDN这个页面的代码还是看着不是那么舒服。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int count=1,x=1;
cin>>n;
while(x<n)
{
x=x*10+1;
count++;
} //为了不输出0,即商为零的情况
//一开始被卡这里了,没加这一步,输出来的结果有时候会带0.
while(1)
{
if(x%n!=0)
{
cout<<x/n;
x=x%n;
x=x*10+1;
count++;
}//这里面的操作是我参考了好几位神人的笔记,终于悟了
//原来就是一个简单的除法运算列竖式的过程
//相信你列个竖式随便除一下,肯定也和我一样豁然开朗。
//最后的那个光棍数所有位上都是1,所以直接除,然后取余,取余之后补1。
//这就是 x=x%n; x=x*10+1;这两步的由来,本质上是实现了一个除法的计算过程。
else
{
cout<<x/n;
break;
}
}
cout<<" "<<count<<endl;
}
最后必须敲黑板:
这是我辗转各家的时候,看到的一个神人的想法,他直接用到了c++的位运算,让我不禁直接点赞,大呼牛皮。
可以看一下:
#include<bits/stdc++.h>
using namespace std;
int x,ans,tot,flag;
int main()
{
cin>>x;
for(ans=1;;ans++)
{
tot=(tot<<3)+(tot<<1)+1;
if(tot>=x)
{
flag=1;
cout<<tot/x;
}
else if(flag)cout<<0;
tot%=x;
if(!tot)break;
}
cout<<' '<<ans;
return 0;
}
"<<“和”>>"的位运算,实不相瞒,我也只是在刚学到的时候了解了一下,压根没想到有人竟然能把它用在这里,惊艳的想法。
如果你不太了解位运算的话,可能看不懂哈,可以跳转到这里位运算的总结充个电。
时光荏苒,岁月如梭,韶华不负,未来可期
仰望星空,脚踏实地,加油。