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的大小写还能控制输出的十六进制字母大小写);

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄