这道题的解题过程真是一波三折,也真是发现人外有人,天外有天,好多神人真是。
原题如下图,也可点击这个链接到原题自己测试光棍原题链接:
一开始做的时候的想法: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;
}
"<<“和”>>"的位运算,实不相瞒,我也只是在刚学到的时候了解了一下,压根没想到有人竟然能把它用在这里,惊艳的想法。
如果你不太了解位运算的话,可能看不懂哈,可以跳转到这里位运算的总结充个电。
时光荏苒,岁月如梭,韶华不负,未来可期
仰望星空,脚踏实地,加油。