标题:这么题目怎么做啊
只看楼主
zrf625278699
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2008-10-14
 问题点数:0 回复次数:6 
这么题目怎么做啊
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,
每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数
字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,
2,…,9。

给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。计算书的全部页码中分别用到多少
次数字0,1,2,…,9。

每个文件只有1 行,给出表示书的总页码的整数n。

输出文件共有10行,在第k行输出页码中用到数
字k-1 的次数,k=1,2,…,10。

Sample Input

11

Sample Output

1
4
1
1
1
1
1
1
1
1




说个想法也行  呵呵 谢谢
搜索更多相关主题的帖子: 计算书 自然数 
2008-11-16 20:34
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
得分:0 
你可以十进制模拟,这样比较快。
2008-11-16 20:36
zrf625278699
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2008-10-14
得分:0 
回复 2# 的帖子
具体点吧
2008-11-16 20:44
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
得分:0 
首先,页码个位为1~9-0-1~9-0,十位一循环。
则需要0~9各n/10个,还需要1~n%10各一个。
然后n/=10,该问题转化为原问题了……

我觉得这题目主要考高精度而已……不过才10^9,应该谈不上高精,普通64位应该能处理,水题……

[[it] 本帖最后由 风居住的街道 于 2008-11-17 06:37 编辑 [/it]]
2008-11-17 06:23
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
得分:0 
这次应该对了……麻烦的模拟题…………
程序代码:
/***********************************************************
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照
通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页
用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的
总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…
,9。

给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。计算书的全部
页码中分别用到多少次数字0,1,2,…,9。

每个文件只有1 行,给出表示书的总页码的整数n。

输出文件共有10行,在第k行输出页码中用到数字k-1 的次数,k=1,
2,…,10。

Sample Input

11

Sample Output

1
4
1
1
1
1
1
1
1
1
*********************************************************/
#include <stdio.h>
#include <string.h>

int main(void)
{
    int c[10] = {0}, n, k, i;
    scanf("%d", &n);
    for (k = 1; k <= n; k *= 10)
    {
        int r1 = (n / k - 1) / 10, r3 = (n / k) % 10;
        int r2 = (r3 + 9) % 10;
        if (r1 > 0)
        {
            for (i = 0; i < 10; i++)
                c[i] += r1 * k;
        }
        for (i = 1; i <= r2; i++)
            c[i] += k;
        c[r3] += n % k + 1;
    }
    for (i = 0; i < 10; i++)
        printf("%d\n", c[i]);
    return 0;
}


[[it] 本帖最后由 风居住的街道 于 2008-11-17 09:08 编辑 [/it]]
2008-11-17 07:49
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
10的9次方是10亿,普通32位有符号整数就可以
另外我上次就同一个问题写的最老实的代码,LZ说没看懂,所以这个明显比我的效率更高从而更难理解的代码LZ估计也看不懂,建议我们一起努力让LZ看懂。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-11-17 10:53
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
得分:0 
其实很简单,就是把每一位的数字划分为三组:完全组,不完全组和零散组。
完全组就是能完整组成1234567890的组,不完全组就是末尾零散的组,除了最后一个,之所以区别开最后一个是为了包容低一层的零散组。

这样,整个程序就逻辑清晰了。

PS 完全组必须减一,从而让另外两个组至少有东西,因为这个原因这程序我调试了几个小时……郁闷……
2008-11-17 11:02



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




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

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