4.11 | 学习笔记
1.打表法再解"1的个数问题”(应该会快点?)
之前的代码,思路就是写一个判断函数,然后遍历给出的范围
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。#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<<":\n"<<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<<":\n"<<f[n]<<endl;
}
return 0;
}
2.进制转换...
注意:1)写进制转换函数必须特判零!!!
2)二进制自己写个函数,八进制和十六进制可以直接printf格式化输出,
八进制:printf("%o\n",n); 十六进制printf("%X\n",n)(这里X的大小写还能控制输出的十六进制字母大小写);
更多精彩

