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种情况。
时间有限,我先答这么多。