hdoj-2089-不要62

题目:不要62
代码1:(TLE)

#include<stdio.h>
#include<string.h>
int main()
{
	int n,m,i,j,t=0;
	int a,b,sum=0,k=0;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		if(n==0 && m==0)break;
		for(i=n;i<=m;i++)
		{
			a=i;
			b=i;
			
			sum++;
			
			while(a>0)
			{
				if(a%100==62)
				{
					sum--;
					k=1;
					//printf("%d -1
",a);
					break;
				}
				a=a/10;
			}//是不是62
			
			while(b>0)
			{
				if(b%10==4 && k==0)
				{
					//printf("%d -2
",b);
					sum--;
					break;
				}
				b=b/10;
			}//位数是否含四
			
			k=0;
		}
		printf("%d
",sum);
	}
	return 0;
}

说实在,我认为我的代码T有一点说不过去。但是它T了,discuss里也是哀声四起。hdoj里面虽说有很多好题目,但是其中个别题目质量堪忧,比如2090算菜价,明明要求四舍五入(printf("%.1lf ",(n*m+0.05));),但是提交评测以后居然是WA,删除以后AC。
这道容易懂的题目有一种更省时间的算法,我没看到它之前没有想到这个方法。这里也贴出来:

#include<stdio.h>
int data[1000005];
int main()
{
	int m,n;
	int i;
	int t;
	int sum;
	for(i=4;i<=1000003;i++)
	{
		t=i;
		while(t)
		{
			if(t%10==4||t%100==62)
				data[i]=1;//符合要求数组存1
			t/=10;
		}
	}
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		sum=0;
		if(m==0&&n==0)
			break;
		for(i=m;i<=n;i++)
			sum+=data[i];
		printf("%d
",n-m+1-sum);
	}
	return 0;
}

先从很大范围内找出符合要求的所有数,若符合要求数组存1,之后再在输入流里面累加,n-m+1-sum

先在大范围中找出符合要求的数存入数组,在需要使用的时候调用数组内元素。省时的一种小技巧。

原文地址:https://www.cnblogs.com/qq952693358/p/5271560.html