| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5753 人关注过本帖, 1 人收藏
标题:统计1到N之间数字1的个数
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 10楼 Magic_July
这么坚定地相信你的理解是对的么?为什么不提交一下小曹的代码试试呢?

重剑无锋,大巧不工
2013-02-20 18:22
Merry_sf
Rank: 2
等 级:论坛游民
帖 子:30
专家分:24
注 册:2012-12-9
收藏
得分:0 
程序代码:
#include <stdio.h>
#define M 9999
int main(void)
{
    int c[M+1];//存储1~N里面1的个数
    int num[M];//存储输入的数
    int i,j,k=0,d,n;
    for(i=1,d=0;i<=M;i++)
    {
        for(j=1;i/j;j*=10)
        {
            c[i]=d;
            if(i/j%10==1)
               c[i]=++d;
        }
    }//算出所以的数
    printf("Input:\n");
    while(scanf("%d",&n),n)
    {
        num[k]=n;
        k++;
    }
    printf("\nOutput:\n");
    for(i=0;i<k;i++)
    {
        printf("%d\n",c[(num[i])]);//输出1~已输入数n里面1的个数
    }
    return 0;
}
2013-02-20 18:46
Merry_sf
Rank: 2
等 级:论坛游民
帖 子:30
专家分:24
注 册:2012-12-9
收藏
得分:0 
  楼主 不得不说 你的算法是有问题的   很简单  1~11 里面有4个1  你这个输出的是3  1~111里面有36个1  你这个输出的是31  这里面你忽略了高位上原有的1
我顺着你的思路 把你的代码改了下 然后我把我对题目的要求的理解也写进了代码 你就知道 那个输入 输出的要求 是什么意思了
2013-02-20 18:55
Merry_sf
Rank: 2
等 级:论坛游民
帖 子:30
专家分:24
注 册:2012-12-9
收藏
得分:5 
回复 10楼 Magic_July
好吧 原来楼主是理解错了题目的意思 = =  题目意思应该是出现1的个数 而不是含有1的整数的个数
2013-02-20 18:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
回复 10楼 Magic_July
我明白我错在什么地方了,少判断了当n为0的情况,应当加一句 if(n==0) return 0;
#include <stdio.h>

// 递归方法
int recursion( int n )
{
    int base = 1;
    if( n == 0 )
        return 0;
    if( n < 10 )
        return 1;
    for( ; n>=base*10; base*=10 );

    return n/base*recursion(base-1) + ( n/base==1 ? n%base+1 : base ) + recursion(n%base);
}

int main()
{
    int n;
    for( ; scanf("%d",&n)==1 && n!=0; )
        printf( "%d\n", recursion(n) );

    return 0;
}
2013-02-21 09:04
shelltonWU
Rank: 2
等 级:论坛游民
帖 子:16
专家分:66
注 册:2013-2-15
收藏
得分:0 
楼主错啦。楼主看看它给的例子。“N=10,1,2.....10中包含两个数字1”。你改成求1的个数去oj试试吧。反正又不麻烦,

一切为了明天。
2013-02-21 10:22
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
收藏
得分:0 
程序代码:
#include"stdio.h"
int main()
{
    int x[9999],i,j,d,N;
    for(i=0,d=0;i<9999;i++)
    {
        for(j=1;i/j;j*=10)
        {
            if(i/j%10==1)
            {x[d]=i;
            if(x[d]==x[d-1])
            x[d-1]==-1;
            //printf("%d d=%d ",x[d],d);
            d++;
            }
        }
    }
    while(scanf("%d",&N),N)
    {
        for(i=0;i<9999;i++)
        {
            if(N>=9991){printf("4000\n");break;}
            if(x[i]<=N&&x[i+1]>N)
            {
                if(x[i]==-1)
                continue;
                else
                printf("%d\n",i+1);break;}
        }
    }
    return 0;
}

自己AC后的代码
是我理解错了
我太年轻了
2013-02-21 12:22
wuyishan
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-25
收藏
得分:0 
1到N所有整数包含1的个数程序和1到N所有整数包含1的整数个数程序
---------1到N所有整数包含1的个数程序--------

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i,m=0,x,y,z,n,k;
    printf("请输入正整数n(1<=n<=9999):\n");
    scanf("%d",&n);
    for(i=0;i<=n;i++)
    {
                    x=i/1000;
                    if(x==1)
                       m++;
                    y=i/100%10;
                    if(y==1)
                      m++;
                    z=i%100/10;
                    if(z==1)
                       m++;
                    k=i%10;
                    if(k==1)
                       m++;
      }
    printf("\n1到%d的所有整数包含1的个数为:%d\n",n,m);
  system("pause");
}
---------1到N所有整数包含1的个数程序--------
--------1到N所有整数包含1的整数个数程序------
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i,m=0,x,y,z,n,k;
    printf("请输入正整数n(1<=n<=9999):\n");
    scanf("%d",&n);
    for(i=0;i<=n;i++)
    {
                    x=i/1000;                    
                    y=i/100%10;                    
                    z=i%100/10;                    
                    k=i%10;
                    if(x==1||y==1||z==1||k==1)
                       m++;
      }
    printf("\n1到%d的所有整数包含1的整数个数为:%d\n",n,m);
  system("pause");
}

--------1到N所有整数包含1的整数个数程序------
2013-02-25 15:21
gezhongfeng
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2013-2-2
收藏
得分:0 
#include "stdio.h"
int main()
{
    int x[9999],i,j,d,N;

    int xx[9999] = {0};
    int i_count = 0;

    for(i=0,d=0;i<9999;i++)
    {
        for(j=1;i/j;j*=10)
        {
            if(i/j%10==1)
            {
                x[d]=i;
            //printf("%d d=%d ",x[d],d);
            d++;
            break;}
        }
    }

    while(scanf("%d",&N),N)
    {
        for(i=0;i<9999;i++)
        {
            if(N>=9991)
            {
                printf("3439\n");
                break;
            }
            if(x[i]<=N&&x[i+1]>N)
            {
                //printf("%d\n",i+1);
                xx[i_count++] = i+1;
                break;
            }
        }
    }

    for(i= 0;i <i_count;i++ )
    {
        printf("%d\n",xx[i]);

    }
    return 0;
}
2013-02-25 16:41
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
自诩时间复杂度为O(1)的算法,求喷。
思路:将一个整数自最高位拆分为两部分 如[0 - 5234]=[0 - 499]+[5000 - 5234],[x - y]表示x-y间1的个数
[0-499]为5*[0-99]+100,100是[100-199]多出的100个
[5000-5234]=[0-234],递归求解即可,其中如果高位是1 需加上多出的1 如[1000-1234]=[0-234]+235
运算过程中,将[0-9,99,999]的个数保存起来 只计算一次 则函数执行的时间只取决于整数的位数 而与其大小无关 可视为常量时间复杂度
程序代码:
int num_1_rec(int n)
{
    static int num_base[4] = {0, 0, 0, 1};  //分别存放0-9,99,999,9999中出现的1的个数 
    
    //个位数直接退出
    if(n == 0) return 0;
    else if(n < 10) return 1;
    
    int base = 1, basepos = -1, i, nH, nL; 
    
    //求解n(>=10)的数基(Exp. 50的数基为10),以及其对应的num_base的下标位置 
    while((i = n/base) >= 10){
        base *= 10;
        basepos++;
    }
    
    //最高位产生的1的个数(Exp. 2523, 0-1999中1的个数) 
    nH = num_base[basepos] != 0 ? num_base[basepos] : num_1_rec(base-1);
    nH *= i;
    if(i > 1) nH += base;
    else nH += n%base + 1;  //最高位为1的情况的特殊处理 
    
    //低位产生的1的个数(Exp. 2523, 2000-2523[0-253]中1的个数) 
    nL = num_1_rec(n%base);
    
    //保存已经计算过的0-9,99...中1的个数 
    if(n+1 == base*10) num_base[basepos+1] = nH+nL;
    
    return nH+nL;            
}

人生是一场错过 愿你别蹉跎
2013-02-25 23:16
快速回复:统计1到N之间数字1的个数
数据加载中...
 
   



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

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