标题:试计算在区间 1 到 n 的所有整数中,数字 x(0≤x≤9)共出现了多少次?
只看楼主
木水QWQ
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-2-23
结帖率:0
已结贴  问题点数:20 回复次数:4 
试计算在区间 1 到 n 的所有整数中,数字 x(0≤x≤9)共出现了多少次?
试计算在区间 1 到 n 的所有整数中,数字 x(0≤x≤9)共出现了多少次?例如,在1到11中,即在 1、2、3、4、5、6、7、8、9、10、11中,数字1出现了4次。
输入格式
输入共1行,包含2个整数n、x,之间用一个空格隔开。
输出格式
输出共1行,包含一个整数,表示x出现的次数。
例如:
输入  11  1
输出   4
#include<stdio.h>
int main()
{
int i,j,n,x,k=0;
char *a;
scanf("%d%d",&n,&x);
for(i=1;i<=n;i++)
for(j=i;j;j/=10)
if(j%10==x)k++;
printf("%d\n",k);
return 0;
}
我想知道为啥这样做,第7.8.9行不理解
搜索更多相关主题的帖子: 计算 区间 整数 数字 出现 
2018-03-05 11:10
LeilaStark
Rank: 2
等 级:论坛游民
帖 子:6
专家分:18
注 册:2018-3-5
得分:10 

比如
一个数123
123%10 就是它的个位3
123/10=12 12%10就是它的十位2
123/10/10=1 1%10就是它的百位1
这么做就是取一个数的每一位与n对照
2018-03-05 14:15
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:10 
0-9里面有1个单位x的数字有C(1,1)*1*9^0个

0-99里面有1个单位x的数字有C(2,1)*1*9^1个,有2个单位x的数字有C(2,2)*2*9^0个

0-999里面有1个单位x的数字有C(3,1)*1*9^2,有两个单位x的数字有C(3,2)*2*9^1个,有3个单位的数字x有C(3,3)*3*9^0个

变通一下就可以求0-1000的有多少个x
再变通一下就可以求0-2000,0-3000,0-4000……0-9000有多少个x
再变通一下就可以求0-n有多少个x
例如12345=10000+2000+300+40+5
最后就可以求1-n有多少个数字x了~


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-06 17:27
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 3楼 九转星河
@九转星河

你复杂了!!!

以1为例

0-9有1个1
0-99有20个1
0-999有300个1

分开数位来看就容易看出来了,真是的,快点面代码思过去~

我先吃瓜去~



[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-06 22:53
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
弄了个出来,测试一下看看效果如何~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

unsigned fun( unsigned ,unsigned );

int main( void )
{
    unsigned n=0;
    unsigned x=0;
    
    if (scanf("%u%u",&n,&x)!=2||x>9)
        exit(0);
    
    printf("%u\n",fun(n,x));
        
    return 0;
}

unsigned fun( unsigned n,unsigned x )
{
    unsigned s=0;
    unsigned count=0;
   
   unsigned i;
   
   assert(n);
   assert(x<10);
   
   
   for (i=1;i<=n;i*=10)
   {
      unsigned k=( unsigned )(n/i)%10;
  
       s+=count*k*i/10;

       if (k==x)
           s+=n%i+1;
       else if (k>x)
           s+=i;
                     
       ++count;
   }
   
   if (x==0)
       while (i/=10)
           s-=i;
   
    return s;
}


[此贴子已经被作者于2018-3-9 09:16编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-07 12:46



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




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

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