| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1399 人关注过本帖
标题:请问这个数字统计的题该怎么写
只看楼主 加入收藏
楚煜
Rank: 1
来 自:L
等 级:新手上路
帖 子:15
专家分:0
注 册:2020-1-21
结帖率:50%
收藏
已结贴  问题点数:14 回复次数:5 
请问这个数字统计的题该怎么写
数字统计
描述
请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。
比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。
输入
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。
输出
输出共 1 行,表示数字 2 出现的次数。
输入样例 1    输出样例1
2 22                6
搜索更多相关主题的帖子: 输入 出现 数字 统计 输出 
2020-08-28 15:57
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:566
专家分:3690
注 册:2019-7-29
收藏
得分:7 
程序代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int main()
{
    int min_number,max_number,i,sum=0,temp;
    printf("请输入2个整数:");
    scanf("%d %d",&min_number,&max_number);
    while(min_number>max_number)
    {
        printf("输入数据错误,请重新输入2个整数:");
        scanf("%d %d",&min_number,&max_number);
    }

    for(i=min_number; i<=max_number; i++)
    {
        temp=abs(i);
        while(temp>0)
        {
            if(temp%10==2)
                sum++;
            temp/=10;
        }
    }
    printf("共有%d个2\n",sum);

    return 0;
}

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-08-28 21:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:7 
这道题怎么做,取决于老师想考察你什么。

如果是考察你的语法,那么应该用最简单的方法
程序代码:
unsigned foo( unsigned L, unsigned R )
{
    unsigned count = 0;
    for( unsigned i=0; i!=R-L+1; ++i )
        for( unsigned t=i+L; t!=0; t/=10 )
            count += t%10==2;
    return count;
}

闭着眼睛都可以盲打出来,但算法复杂度是 O(R-L)

如果是考察你的算法,那么应该用最高效的方法
程序代码:
unsigned bar( unsigned L, unsigned R )
{
    L -= L>0;
    unsigned count = 0;
    for( unsigned a=1; 2*a<=R; a*=10 )
        count += R/a/10*a + (R/a%10==2)*(R%a+1) + (R/a%10>2)*a - L/a/10*a - (L/a%10==2)*(L%a+1) - (L/a%10>2)*a;
    return count;
}

算法复杂度最高是 O(10)

程序代码:
#include <iostream>
using namespace std;

unsigned foo( unsigned L, unsigned R )
{
    L -= L>0;
    unsigned count = 0;
    for( unsigned a=1; 2*a<=R; a*=10 )
        count += R/a/10*a + (R/a%10==2)*(R%a+1) + (R/a%10>2)*a - L/a/10*a - (L/a%10==2)*(L%a+1) - (L/a%10>2)*a;
    return count;
}

int main( void )
{
    unsigned L, R;
    cin >> L >> R;
    cout << foo(L,R) << endl;
}
2020-08-29 12:03
楚煜
Rank: 1
来 自:L
等 级:新手上路
帖 子:15
专家分:0
注 册:2020-1-21
收藏
得分:0 
好的,谢谢☺☺☺

为了梦想,为了未来,为了信仰。
2020-08-30 20:02
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
回复 3楼 rjsp
强!能不能简要讲一下高效算法的原理,说实话,没看明白
2020-09-12 18:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 5楼 lxk1732942
“[L,R]的所有整数中,数字2出现的次数”
可以简化为
“[0,R]的所有整数中,数字2出现的次数” 减去 “[0,L-1]的所有整数中,数字2出现的次数”


“[0,N]的所有整数中,数字2出现的次数”
可以分解为“[0,N]中 个位为2的次数 + 十位为2的次数 + 百位为2的次数 + ……”
以求百位为2的次数为例:
如果百位上本身就是2,例如abc2de,那么[0,abcde]在百位上插入一个2就是了,所以一共有abcde+1个;
如果百位上小于2,例如abc1de,那么[0,abc00-1]在百位上插入一个2就是了,所以一共有abc00个;
如果百位上大于2,例如abc5de,那么[0,abc99]在百位上插入一个2就是了,所以一共有abc00+100个。
2020-09-14 09:59
快速回复:请问这个数字统计的题该怎么写
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018247 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved