标题:提问 数字统计的题 两个代码有何不同
只看楼主
yap
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-7-2
结帖率:0
已结贴  问题点数:20 回复次数:4 
提问 数字统计的题 两个代码有何不同
题目:请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。
比如在给定范围[2, 22],数字2在数2中出现了1次,在数12中出现了1次,在数20中出现了1次,在数21中出现了1次,在数22中出现了2次,所以数字2在该范围内一共出现了6次。

第一个代码是这样
#include<iostream>
using namespace std;
int main()
{
    int l, r, count = 0;
    cin >> l >> r;
    for(int i = l ; i <= r; i++)
    {
        int t = i;
        while(t != 0)
        {
            if(t % 10 == 2)
                count ++;
            t /= 10;
        }
    }
    cout << count << endl;
    return 0;
}

第二个代码是这样,但是会超时

#include<iostream>
using namespace std;
int main()
{
    int l, r, count = 0;
    cin >> l >> r;
    for(; l <= r; l++)
    {
        while(l != 0)
        {
            if(l % 10 == 2)
                count ++;
            l /= 10;
        }
    }
    cout << count << endl;
    return 0;
}

求助!
搜索更多相关主题的帖子: 数字 代码 出现 int count 
2017-07-02 21:32
lmlm1001
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:4
帖 子:107
专家分:550
注 册:2015-3-1
得分:10 
第二个代码应该是死循环。
原因是,在以l为循环变量的循环中,修改了l的值,使得每次退出while循环时,l = 0, 在for循环中 l 只能是0或者1,如果你输入的r值大于等于1,则死循环。
2017-07-02 21:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
请统计某个给定范围[L, R]的所有整数
如果一个为正,一个为负,比如 [-10,+100],那么 f(-10,+100) = f(0,10) + f(0,100)
如果两个都为正,比如 [+10,+100],那么 f(+10,+100) = f(0,100) - f(0,9)
如果两个都为负,比如 [-10,-100],那么 f(-100,-10) = f(0,100) - f(0,9)
所以,欲求[L, R]内2的数目,得先求[0,N]内2的数目

这是我从你的代码中提取出来的算法
程序代码:
unsigned your( unsigned n )
{
    unsigned count = 0;
    for( unsigned i=0; i<=n; ++i )
    {
        for( unsigned j=i; j!=0; j/=10 )
            if( j%10 == 2 )
                ++count;
    }
    return count;
}

这是我自己写的算法
程序代码:
unsigned mine( unsigned n )
{
    unsigned count = 0;
    for( unsigned i=1; i<n; i*=10 )
    {
        unsigned high = n/i/10;
        unsigned mid = n/i%10;
        unsigned low = n%i;
        if( mid < 2 )
            count += high*i;
        else if( mid > 2 )
            count += high*i + i;
        else
            count += high*i + low + 1;
    }
    return count;
}

2017-07-03 10:16
yap
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-7-2
得分:0 
回复 2楼 lmlm1001
好,但为什么第一个你说的死循环的代码也能出结果呢?我试了几组数,一二两个代码结果都是一样的,但是在Vijios上一个代码就会超时
2017-07-03 14:56
yap
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-7-2
得分:0 
回复 3楼 rjsp
好的谢谢!
再问你一下,为什么我的第二个代码也能出结果,我感觉像楼上说的是进入死循环了,但是为什么两个代码出的结果是一样的?
但是第二个代码就会超时。
2017-07-03 18:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-479110-1-1.html




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

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