• 计数问题—分治


    给定两个数a和b,计算出1在a和b之间出现的次数。

    解题思路:

          可以由分治算法的思想,先求出1在0~a中出现的次数,再求出1在0~b中出现的次数,然后两者相减即可。

     1 #include<stdio.h>
     2 int d[11];//d[n]存储数字0~9分别出现的次数。
     3 int value;//记录相应的权值变化
     4 void deal(int n)
     5 {
     6     if(n<=0)
     7         return;
     8     int one,ten;//one,ten分别代表个位和十位、
     9     one=n%10;
    10     n/=10;
    11     ten=n;
    12     int i;
    13     for(i=0;i<one;i++)//将个位上出现的数统计下来
    14         d[i]+=value;
    15     while(ten)
    16     {
    17         d[ten%10]+=(one+1)*value;
    18         ten/=10;
    19     }
    20     for(i=0;i<10;i++)
    21         d[i]+=value*n;
    22     d[0]-=value;//将第一位是0的情况排除
    23     value*=10;//权值变化,变为原来的10倍
    24     deal(n-1);
    25 }
    26 int main()
    27 {
    28     int a,b,i;
    29     while(scanf("%d%d",&a,&b))
    30     {
    31         if(a==0&&b==0)
    32             break;
    33         if(a<b)
    34         {
    35             int temp=b;
    36             b=a;
    37             a=temp;
    38         }
    39         for(i=0;i<11;i++)
    40             d[i]=0;
    41         value=1;
    42         deal(a);
    43         value=-1;//此处value=-1是为了求出最后的答案deal(a)-deal(b)
    44         deal(b-1);
    45         printf("%d\n",d[1]);
    46     }
    47     return 0;
    48 }
  • 相关阅读:
    创建FLASK,同步docker
    FLASK Buleprint
    restful api
    Angular JS
    线程日志
    将项目部署到linux下的docker容器中
    安装和卸载docker
    学习目录总编
    Ansible
    装饰器
  • 原文地址:https://www.cnblogs.com/pony1993/p/2525832.html
Copyright © 2020-2023  润新知