| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2202 人关注过本帖, 2 人收藏
标题:奉上一个有一定难度的题目,欢迎大家来挑战!
只看楼主 加入收藏
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
结帖率:66.67%
收藏(2)
已结贴  问题点数:20 回复次数:28 
奉上一个有一定难度的题目,欢迎大家来挑战!
给定两个数a和b,计算出在a和b间1出现的次数,例如:a=1028,b=1032则它们间的数为1028,1029,1030,1031,1032其中1出现的次数为6。
输入:不超过十行,每行两个数a和b。范围大于零小于100000000。输入两个零为结束输入。
输出:一行输出一个数。
参考:1         10
      44       497
346      542
1199    1748
1496      1403
1004     503
0     0
输出:

2
185
40
666
113
105

过两天我就会把我的算法发上来.大家先尝试下,也可以要提示.多交流。
搜索更多相关主题的帖子: 挑战 
2012-07-14 21:48
clyde3
Rank: 2
等 级:论坛游民
帖 子:68
专家分:65
注 册:2012-7-10
收藏
得分:3 
坐等大虾!

堇色安年,谁许我一世荒芜→→玖零逅.那扯蛋的青春!
2012-07-14 22:21
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这不就是我让大家数数字的翻版么?建议看看这个贴子。
https://bbs.bccn.net/thread-371905-1-1.html

重剑无锋,大巧不工
2012-07-14 23:22
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
写得脑子有点混乱了,求看看是不是正确的,如果是的话再奉上思路,顺便改进下其中写得乱七八招的地方
程序代码:
#include <stdio.h>
#include <stdlib.h>

int n,m;

int F(int p)
{
    int ans=0,i,j,k,s;
    
    j=0; k=p; 
    while (k>0) 
    {
          if (k%10==1) j++; k/=10;
    }
    
    i=-1; s=1;
    while (p>0)
    {
          i++; 
          k=p%10; p/=10;
          if (k==1) j--;
          ans+=k*s*j;
          if (k==1) ans+=s*i/10+1; else
          if (k>=2) ans+=s*i/10*k+s;
          s*=10;
    }
    return ans;
}

int main()
{
    scanf("%d%d",&n,&m);
    printf("%d\n",F(m)-F(n-1));
    
    system("pause");
}
2012-07-15 01:09
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
收藏
得分:3 
有几种方法,我说一种吧!
对于输入、输出部分就免了。只写算法部分:

for(第一行开始;未到最后一行;下一行){
    for(i=a;i<=b;i++){
        将i转换为字符串;
        数出该字符串中'1'的个数;
        输出个数;
    }
}

做自己喜欢的事!
2012-07-15 07:07
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
收藏
得分:0 
回复蝙蝠侠:你这方法是最基本的,希望有更好的算法。
2012-07-15 09:03
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
试试这个。
程序代码:
#include<stdio.h>
int f(int n)
{
    int c, r, i, j;
    for(c = 0, i = 1, j = 10; n / i; i = j, j *= 10)
    {
        c += n / j * i;
        r = n % j - i + 1;
        if(r > 0) c += r > i ? i : r;
    }
    return c;
}
int main()
{
    int a, b;
    while(scanf("%d%d", &a, &b), (a && b))
    printf("%d\n", (a > b ? f(a) - f(b - 1) : f(b) - f(a - 1)));
    return 0;
}


 

重剑无锋,大巧不工
2012-07-15 09:09
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
收藏
得分:0 
杨大哥发的连接我看了下!对于1到1000000这种数(多几个零一样算法)之间1的位数很好算的,但是现在是任意一个整数,可能那些方法就不太适用了,当然可以参考,可以考虑加权的那思路,用第归也可以。
2012-07-15 09:34
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
收藏
得分:0 
上楼的算法,把10代进去,好像就不对,大家请量解,我是用手机完成回复的,不准确的地方多包涵。
2012-07-15 09:51
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
唉,举一反三才叫学习。我们不是为了做题而做题,我们是为了通过做一道题而掌握一种解决问题的思想,从而将来可以应用于一类问题。

想让你看的是连接里大家讨论的解题思想。

如果我换个问法,计算a到b之间所有数每位(十进制)上数字的和,你觉得和现在的题目差异有多少?如何借鉴现在的做法?什么地方不同,改如何修改?

重剑无锋,大巧不工
2012-07-15 09:56
快速回复:奉上一个有一定难度的题目,欢迎大家来挑战!
数据加载中...
 
   



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

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