签到题-1 装13 (10 分)

众所周知,勋总的最大乐趣就是挑选“1”(狗头保命),但是今天勋总自己要参加蓝桥校选,并且马上就要迟到了,为了尽快到达考场,所以他不能精心地挑选“1”了。但是勋总的宿舍里藏了许多1和0,勋总要去比赛时,随手抓了一把1和0放入书包里,勋总的书包刚好有30个空位,所以包里面最多可以容纳30个"0"或"1",本着越多越好的原则,勋总拿满了30个。

我们将背包里面从上到下的30个位置,用一个非负整数n表示,若n=7,表示书包内的状态(n的二进制形式)为000000000000000000000000000111(不用数了,前面共27个0)。

但是对于苛刻的勋总,勋总最喜欢的莫过于13个连续的"1"了,如果n内存在13个连续的1,则说明他今天成功装13了,此时我们输出YES,否则输出NO。

输入格式:

仅一行,一个非负整数n,代表书包内的状态的十进制形式

输出格式:

输出一行,为YES或NO,代表勋总今天是否成功的装13

输入样例:

1048551

输出样例:

YES

注:结尾有换行\n

样例解释

n=1048551,表示书包内的状态为000000000011111111111111100111,其中包含一段15个连续的1,即必然存在一段连续的13个1,故输出为YES

数据规模及约定

对于100%的测试点,0≤n<2^30
,

答案

第一次

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int t=0;//计数 
	for(int i=0;i<30;i++)
	{	
		n=n-i;
		if(n>=0)
			t++;
		else
			t=0;
		if(t==13)
		{
			cout<<"YES";
			return 0;
		}
	}
	cout<<"NO";
	return 0;
 } 

在这里插入图片描述
应该是对于较大的数字无法实现正确计算照成的,使用减法应该是通过不了所有测试点

第二次

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int t=0;//计数 
	for(int i=0;i<30;i++)
	{	
		int a,b;
		a=n%2;
		//b=n/2;
		//if(b==0)
			//break;
		if(a==1)
			t++;
		else
			t=0;
		if(t==13)
		{
			cout<<"YES";
			return 0;
		}
		n=n/2;
	}
	cout<<"NO";
	return 0;
 } 

在这里插入图片描述
无需让小数字提前退出循环,因为0%2=0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值