題目:不要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\n",a);
break;
}
a=a/10;
}//是不是62
while(b>0)
{
if(b%10==4 && k==0)
{
//printf("%d -2\n",b);
sum--;
break;
}
b=b/10;
}//位數是否含四
k=0;
}
printf("%d\n",sum);
}
return 0;
}
說實在,我認爲我的代碼T有一點說不過去。但是它T了,discuss裏也是哀聲四起。hdoj裏面雖說有很多好題目,但是其中個別題目質量堪憂,比如2090算菜價,明明要求四捨五入(printf("%.1lf\n",(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",n-m+1-sum);
}
return 0;
}
先從很大範圍內找出符合要求的所有數,若符合要求數組存1,之後再在輸入流裏面累加,n-m+1-sum
。
先在大範圍中找出符合要求的數存入數組,在需要使用的時候調用數組內元素。省時的一種小技巧。