L1-046 整除光棍 (20 分)

这道题的解题过程真是一波三折,也真是发现人外有人,天外有天,好多神人真是。

原题如下图,也可点击这个链接到原题自己测试光棍原题链接:
题目

一开始做的时候的想法: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;
}

"<<“和”>>"的位运算,实不相瞒,我也只是在刚学到的时候了解了一下,压根没想到有人竟然能把它用在这里,惊艳的想法。
如果你不太了解位运算的话,可能看不懂哈,可以跳转到这里位运算的总结充个电。
不负韶华

时光荏苒,岁月如梭,韶华不负,未来可期

仰望星空,脚踏实地,加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值