题目链接:http://codeforces.com/problemset/problem/9/C
题面:
One beautiful July morning a terrible thing happened in Mainframe: a mean virus Megabyte somehow got access to the memory of his not less mean sister Hexadecimal. He loaded there a huge amount of n different natural numbers from 1 to n to obtain total control over her energy.
But his plan failed. The reason for this was very simple: Hexadecimal didn't perceive any information, apart from numbers written in binary format. This means that if a number in a decimal representation contained characters apart from 0 and 1, it was not stored in the memory. Now Megabyte wants to know, how many numbers were loaded successfully.
Input data contains the only number n (1 ≤ n ≤ 109).
Output the only number — answer to the problem.
10
2
For n = 10 the answer includes numbers 1 and 10.
题目大意:
问1-n中,只由01组成的数有多少个。
解题:
在网上看到很多解法,此处罗列一下。
解法一:(函数调用)
来源:http://blog.csdn.net/u013076044/article/details/39032395
代码:
#include <iostream> using namespace std; int n; int ans; void f(int x){ if(x>n) return ; ans++; f(x*10); f(x*10+1); } int main(){ cin>>n; ans=0; f(1); cout<<ans<<endl; }
来源:http://blog.csdn.net/lvshubao1314/article/details/28693243
代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; char a[10]; int sum[11]={0,1,2,4,8,16,32,64,128,256,512}; int main() { while(~scanf("%s",a+1)) { int n=strlen(a+1); int sum1=0; for(int i=1;i<=n;i++) { if(a[i]>'1') { for(int j=1;j<=n-i+1;j++) sum1+=sum[j]; break; } if(a[i]=='1') sum1+=sum[n-i+1]; } printf("%d\n",sum1); } return 0; }
解法三:(搜索)
来源:蠢蠢的我的解法。
代码:
#include <iostream> #include <cmath> #include <string> #include <vector> #include <algorithm> using namespace std; vector <int> store; void add(string s) { int tmp=0,t=1; for(int i=s.length()-1;i>=0;i--) { tmp+=(t*(s[i]-'0')); t*=10; } store.push_back(tmp); } void dfs(string s,int x,int len) { if(x) { s+='1'; add(s); if(len<9) { dfs(s,1,len+1); dfs(s,0,len+1); } else return; } else { s+='0'; add(s); if(len<9) { dfs(s,1,len+1); dfs(s,0,len+1); } else return; } } int main() { dfs("1",0,1); dfs("1",1,1); store.push_back(1); sort(store.begin(),store.end()); int n,ans=0,sz=store.size(); cin>>n; for(int i=0;i<sz;i++) { if(store[i]<=n) ans++; else break; } cout<<ans<<endl; return 0; }
所谓数位dp实际与找规律相似。
来源:扒队友的
代码:
#include <cstdio> #include <iostream> using namespace std; int dp[15]; int main() { int n,dig[15],i,len,ans; dp[0]=1; dp[1]=2; for(int i=2;i<=10;i++) dp[i]=dp[i-1]*2; scanf("%d",&n); i=1; while(n) { dig[i++]=n%10; n=n/10; } len=i-1; if(dig[len]==1) ans=dp[len-1]-1; else { ans=dp[len-1]-1+dp[len-1]; printf("%d\n",ans); return 0; } for(i=len-1;i>=1;i--) { if(dig[i]>1) { ans+=dp[i-1]*2; break; } else if(dig[i]==1) ans+=dp[i-1]; } if(i==0) ans++; printf("%d\n",ans); return 0; }