从1到500共500个自然数含有数字1和3的数字共有多少个

如题所述

19年3月2日更新

一、考虑只一个位置上有1或3的数字个数。

个位是1或3;十位取0到9内除去1和3的数,有8种取法;百位取0/2/4,有三种取法,总共个数是2*8*3=48个

十位是1或3;个位取0到9内除去1和3的数,有8种取法;百位取0/2/4,有三种取法,总共个数是2*8*3=48个

百位是1或3;十位取0到9内除去1和3的数,有8种取法;个位取0到9内除去1和3的数,有8种取法,总共个数为2*8*8=128个

二、考虑两个位置上有1或3的数字个数。

个位是1或3;十位是1或3;百位取0/2/4,总共个数2*2*3,12个

个位是1或3;十位取0到9内除去1和3的数,有8种取法;百位是1或3,总共个数2*8*2=32个

个位取0到9内除去1和3的数,有8种取法;十位取1或3;百位取1或3,总共个数8*2*2=32个

三、考虑三个位置上有1或3的数字个数

个位是1或3;十位是1或3;百位是1或3,总共个数2*2*2=8个

结论:1到500共500个自然数含有数字1和3的数字共48+48+128+12+32+32+8=308个

另外一种思路是从这500个数里减去三个位置都是不包含1或3的数字个数,剩下的就是我们要求的结果。

要使三个位置都不包含1或3,个位取0到9内除去1和3的数,有8种取法;十位取0到9内除去1和3的数,有8种取法;百位取0/2/4,有3种取法,总的个数是8*8*3=192个,所以最后我们要求的数字个数是500-192=308个。(这里有个小问题需要注意的是我们这个算法实际上是求的000-499之间含有数字1和3的数字共有多少个,因为000-499和1-500含有数字1和3的数字个数一样,所以这个求法是没有问题的。)

------------------------------------------------------------------------------------------------

19年4月30日更新

C语言计算1到N内含有1或者3的数字个数:

#include<stdio.h>

main(){

int i=1;

int cnt=0;//这个变量记录总的数字个数

int n;

scanf("%d",&n);

int j,k;

for(i=1;i<=n;i++){

j=i;

while(j!=0){

k=j%10;

j/=10;

if(k==1){

cnt++;

j=0;//这句至关重要,因为对含有两个1的数字,比如说11,再判断完个位含有1后,就不用对十位再进行判断。它会中断while这个循环。如果没有这句,它还会对十位进行判断,然后造成重复计数。

//printf("%d\n",i);

break;

}

else if(k==3){

cnt++;

j=0;

//printf("%d\n",i);

break;

}

}

}

printf("从1到%d中含有1或者3的数字的总个数是%d个",n,cnt);

return 0;

}

下面是程序运行的结果。

------------------------------------------------------------------------------------------------

19年5月1日更新

C语言实现

#include<stdio.h>

main(){

int i=1;

int cnt=0;

int n;

scanf("%d",&n);

int j,k,d;

for(i=1;i<=n;i++){

j=i;

d=1;

while(j!=0){

k=j%10;

j/=10;

if(k==1){

d=d*2;

}

else if(k==3){

d=d*3;

}

if(d%6==0){

printf("%d ",i);

cnt++;

if(cnt%5==0){

printf("\n");

}

j=0;//这个IF循环可以在发现一个1和一个3后立刻终止WHILE循环,从而停止再向更高位寻找1和3,因而可以加快运行速度。 

}

/*if(d%6==0){

printf("%d\n",i);

cnt++;

}*/

}

}

printf("从1到%d中含有1和3这两个数字的总个数是%d个",n,cnt);

return 0;

}

运行结果:

——————————————————————————————————————

原始回答:

1,3

两位数的情况,如果十位上是一,个位有0到9十种选择,如果个位是一,因为十位是0不行,十位是1刚才已经考虑过了,所以有2到9八种选择。十位是三,有十种选择,减掉31,有9种。个位是3,十位不能是0,1,3。有7种。两位数的情况是10+8+9+7=34种。

三位数,如果百位上是1,那么十位有10种,个位有10种,10*10=100种情况

如果十位是1,百位不能是0,也不能是1,1的情况在上面已经考虑过,百位有8种选择,个位仍然是0到9十种,所以是8*10=80种情况。

时间有限,我先答这么多。

温馨提示:答案为网友推荐,仅供参考
相似回答