链接:https://www.nowcoder.net/acm/contest/74/G
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
杭州人称傻乎乎的人为62,而嘟嘟家这里没有这样的习俗。
相比62,他那里的人更加讨厌数字38,当然啦,还有4这个
数字!所以啊,嘟嘟不点都不想见到包含38或者4的数字。
每次给出一个区间[n,m],你能找到所有令人讨厌的数字吗?
输入描述:
多组输入输出;
输入的都是整数对n、m(0<n≤m<1000000),
如果遇到都是0的整数对,则输入结束。
输出描述:
对于每次的输入
输出全部令人讨厌的数的个数
示例1
输入
1 100
0 0
输出
20
题解:
1.开始是直接判断并相加,但是超时了。后来改进,判断完之后放在一个数组里,之后的每次循环只需要判断数组是否为所要求的数即可。(经过检验,不用数组也是可以的,代码在后面 )
不过,这次学会了用空间来交换时间。
2.输入时//scanf("%d%d",&n,&m)&&n!=0&&m!=0是不对的,这样使m,n中任意一个数为0,就会退出循环。
如果要是两个数同时为0时才退出,有两种方法。
i>
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
}
ii>
while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0))
{
}
#include<bits/stdc++.h>
#define mac 1000100
using namespace std;
int a[mac];
int main()
{
int i,c;
for(i=1;i<=1e6+10;i++)
{
c=i;
while(c!=0)
{
if(c%10==4||c%100==38)
{
a[i]=1;
break;
}
c=c/10;
}
}
int n,m;
while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0))//这点要注意,不是 scanf("%d%d",&n,&m)&&n!=0&&m!=0
{
int sum=0;
for(i=n;i<=m;i++)
{
if(a[i]==1)
sum++;
}
printf("%d\n",sum);
}
return 0;
}
下面这个是修改之前的代码。
#include<stdio.h>
int main()
{
int n,m;
while(~ scanf("%d%d",&n,&m)&&(n!=0||m!=0))
{
int a,b,c,i,sum=0;
for(i=n;i<=m;i++)
{
c=i;
while(c!=0)
{
if(c%10==4||c%100==38)
{
sum++;
break;
}
c=c/10;
}
}
printf("%d\n",sum);
}
return 0;
}