给定一个区间,判断这个区间内有多少数在它的各个位上不含有62或4

含有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;
}

这三种方法的时间复杂度依次降低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值