HAUT oj 1711:这年头难道有人不喜欢签到吗?(21 新生赛-5)

该博客主要探讨了一道编程题,题目要求计算从1到给定正整数n之间,十进制表示的二进制数字中仅包含0和1的个数。博主分享了两种解决方案,一种直接判断每个数是否为二进制形式,另一种通过转换和位运算优化。虽然第一种方法存在超时问题,但通过特殊值处理避免了这个问题。最终,博主给出了AC代码并通过了测试用例。
摘要由CSDN通过智能技术生成

题目描述

    happy快乐题
    输出1-n中十进制二进制数字的个数。怕误解题意,再解释一下,题目意思是输入一个十进制正整数n,输出1到n之间的只由0和1构成的数字的总的个数。

输入

输入一个正整数n。其中n<=1e9;

输出

输出一个正整数表示1-n的十进制二进制数字的个数。

样例输入 Copy

10

样例输出 Copy

2

提示

样例解释:从1到10中有1和10两个符合的数字,因此总个数为2。

思路:找小于等于n的 十进制表示的二进制数 当做二进制数输出对应的十进制 就OK了

这样作有个点一直过不去(呜呜...) 不知道 wa 哪了

然后就找了一个投机取巧的方法  取值在[111111112~999999999]时答案与111111111一样即是511 最大值1000000000是512 将这些较大值拉出来单独判断就不会超时了 小于111111111正常判断就OK了 

AC代码:

#include<stdio.h>
int pd(int n)//判断是不是二进制数 
{
	while(n)
	{
		if(n%10!=0&&n%10!=1)
			return 0;
		n/=10;
	}
	return 1;
}
int main()
{
	//1000 000 000
	//9999 99999
	//1200 00000
	//1111 11112
   int n,d=0;
   scanf("%d",&n);
   if(n==1000000000)//最大点 单独判断防超时 
   {
   	printf("512");
   	return 0;
   }
   if(n>=111111112)// 防超时 
   {
   	printf("511");
   	return 0;
   }
	for(int i=1;i<=n;i++) 
    	if(pd(i))
    		d++;
    printf("%d",d);
    return 0;
}
/**************************************************************
    Time:243 ms
    Memory:1120 kb
****************************************************************/ 

错误代码:不知道哪里不对 欢迎指出.

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
	char ch[20];
	gets(ch);
	ch[strlen(ch)]='\0';
	for(int i=0;i<strlen(ch);i++) // 找出小于等于n的二进制数 
		if(ch[i]>='1'&&ch[i]<='9')
			ch[i]='1';
	int d=0,sum=0;
	for(int i=strlen(ch)-1;i>=0;i--)// 逆序判断 
	{
		if(ch[i]=='1')
			sum+=pow(2,d);
		d++;
	}
	printf("%d",sum);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值