题目
今日份帮忙改代码的题目。自己能过了,先记录一下自己的,小伙伴的问题还没找出来,找出来了再来补记录。
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int sum[1000001]={0};
void func()
{
int i=4;
sum[1]=1;sum[2]=2;sum[3]=3;
for(i=4;i<=1000000;i++)
{
int index=i;
for(;index!=0;)
{
if(index%10==4||index/10==4||index%100==62)
{
sum[i]=sum[i-1];
break;
}
else sum[i]=sum[i-1]+1;
index=index/10;
}
}
}
int main()
{
int m,n;
func();
scanf("%d %d",&m,&n);
while(m!=0&&n!=0)
{
int sum1=0;
sum1=sum[n]-sum[m];
if(sum[m]==sum[m-1]&&m>=4);
else sum1++;
printf("%d\n",sum1);
scanf("%d %d",&m,&n);
}
return 0;
}
刚开始方法是从n判断到m,超时了。想过直接算在m、n之间62和4的摆放情况种类,但好像有点麻烦还没有实现。
改用先用数组存下每个数之前的可用数字个数【含本身】,这样就只要一次遍历,不用每输入一次就要遍历一次。刚开始还是超时,后面发现是把func放在while里了,导致每次输入都遍历,提出来以后就不会超时了。