题目描述
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;
}