含有4或62的数。例如:62315、 73418、 88914。61152虽然含有6和2,但不是62连号,所以不属于。
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。对于每个整数对,输出一个不含有4或6数字的统计个数,该数值占一行位置。
1、用数组,把这个最大为七位数的数字各个位上的数都求出来存入数组然后判断
#include<stdio.h>
int main()
{
int i,j,n,m,s=0,k,a[10];
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{
for(i=n;i<=m;i++)//对从n到m的每一个数都进行判断
{
k=i;
for(j=7;j>=1;j--)//这个数最大是一个七位数,所以把每个数都当一个七位数来求
{
if(j!=7)
{
a[j]=k%10;//求出最低位的数字存入数组
k=k/10;//执行完上一步后用这个数除以10的商再次对10取余求出十位上的数,循环直到求出十万位上的数字
}
else
a[j]=k%10;//求这个数最高位的数字
}
for(j=1;j<=7;j++)
{
if(a[j]==4||(a[j]==6&&a[j+1]==2))
{
s++;
break;
}
}
}
printf("%d\n",m-n-s+1);
s=0;
}
return 0;
}
2、不用数组,直接对这个数的各个位上的数字进行判断
#include<stdio.h>
int main()
{
int i,n,m,k,s=0;
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{
for(i=n;i<=m;i++)
{
k=i;
while(k)
{
if(k%10==4||k%100==62)//先对这个数的个位和最后两位数进行判断
{
s++;
break;//如果满足条件s加一,结束对这个数的判断
}
else
k=k/10;//不满足条件就除去这个数的最低位,再进行判断直到这个数的最高位为止
}
}
printf("%d\n",m-n-s+1);
s=0;
}
return 0;
}
3、用函数
#include<stdio.h>
int ah[1000001];
Init()
{
int i,s;
for(i=1;i<=1000000;i++)//可以求出从1到1000000之间任意一个数(从1到这个数之间一共有多少个数满足含有62或4)
{
s=i;ah[0]=0;
ah[i]=ah[i-1];//从1开始,a[1]=0,到前一位数为止满足条件的数的和的基础上对第i位数进行判断看是否加1
while(s)
{
if(s%10==4||s%100==62)
{
ah[i]++;
break;
}
else
s=s/10;
}
}
}
int main()
{
Init();
int n,m,k;
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{
k=m-n-ah[m]+ah[n-1]+1;
printf("%d\n",k);
}
return 0;
}
这三种方法的时间复杂度依次降低