天梯赛2017年真题(整除光棍)

13 篇文章 0 订阅

原题链接:题目详情 - 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;
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值