1.打表法再解"1的个数问题”(应该会快点?)
之前的代码,思路就是写一个判断函数,然后遍历给出的范围
#include<bits/stdc++.h> using namespace std; int f1(int n) { int cnt=0; while(n) { if(n%10==1)cnt++; n/=10; } return cnt; } int main() { int t,tmp; cin>>t; for(int i=0;i<t;i++) { int sum=0; cin>>tmp; for(int j=1;j<=tmp;j++) sum+=f1(j); cout<<"case #"<<i<<": "<<sum<<endl; } return 0; }
换种思路,因为比如第一次的范围是1到100,那么下次到200就还要再计算一次,所以考虑到打表;
#include<bits/stdc++.h> using namespace std; int f[100010]; int t,n,i,sum,tmp,onenumbers; int main() { for (i=1; i<=100000; i++) { tmp=i; onenumbers=0; while (tmp) { if (tmp%10==1)onenumbers++; tmp/=10; } sum+=onenumbers; f[i]=sum; } cin>>t; for(i=0;i<t;i++) { cin>>n; cout<<"case #"<<i<<": "<<f[n]<<endl; } return 0; }
2.进制转换...
注意:1)写进制转换函数必须特判零!!!
2)二进制自己写个函数,八进制和十六进制可以直接printf格式化输出,
八进制:printf("%o ",n); 十六进制printf("%X ",n)(这里X的大小写还能控制输出的十六进制字母大小写);