1.1分治 例1-1计数问题

题目描述:

给定两个数a和b,计算出1在a和b之间出现的次数。例如,如果a=1024,b=1032,那么a和b之间的数就是:

1024 1025 1026 1027 1028 1029 1030 1031 1032

则有10个1出现在这些数中。

输入:

输入不会超过500行。每行有两个数a和b,a和b的范围是0<a,b<100 000 000。

输入两个0时程序结束,两个0不作为输入样例。

输出:

对于每一对输入的a和b,输出一个数,代表1出现的个数。

样例输入:

1 10

44 497

346 542

1199 1748

0 0

样例输出:

2

185

40

666
解题思路:
本题要求出1在两个数a和b之间出现的次数。可以由分治算法的思想,先求出1在0到a之间出现的次数,再求出1在0到b之间出现的次数,然后两者相减即可。现在的问题转换为如何求出在0到a之间出现的次数。

#include<iostream>
using namespace std;
int deal(int n){
    int sum=0,i,j,k;
    for( i=1;i<=n;i++)  //检查每个数
     {      j=i;
         while(j!=0)   //之前我在这里用了 a ...,一直错误...想了想才发现问题...
         {
             k=j%10;      //从个位开始,检查每一个 位。
             if(k==1)
                sum++;    //如果相等,加 一。

             j=j/10;       //检查后,除去这个 位

         }
     }return sum;}
int main(){
    int  a,b,S;
    while(cin>>a>>b){
    if(a==0&&b==0)break;
    if(a<b){int tmp=b;b=a;a=tmp;}
    S=deal(a)-deal(b);
    cout<<S<<endl;

  }
  return 0;}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值