链接:https://www.nowcoder.com/acm/contest/74/G
来源:牛客网
题目描述
杭州人称傻乎乎的人为62,而嘟嘟家这里没有这样的习俗。
相比62,他那里的人更加讨厌数字38,当然啦,还有4这个
数字!所以啊,嘟嘟不点都不想见到包含38或者4的数字。
每次给出一个区间[n,m],你能找到所有令人讨厌的数字吗?
输入描述:
多组输入输出;
输入的都是整数对n、m(0<n≤m<1000000),
如果遇到都是0的整数对,则输入结束。
输出描述:
对于每次的输入
输出全部令人讨厌的数的个数
示例1
输入
1 100
0 0
输出
20
题解:掌握两个函数,itoa,它有三个变量,第一个是被转换的整数,第二个是转换后的字符数组变量,第三个是进制
strstr,两个变量,在第一个变量中查找第二个变量第一次匹配的位置,没有就返回NULL,接下来看代码
AC代码:
#include<cstdio>
#include<stdlib.h>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
char a[2]="4",b[5]="38";
int s[1000010];
char* itoa(int num,char *str,int radix)//因为这个oj头文件里没有这个函数,所以我把源代码粘了过来
{/*索引表*/
char index[]="0123456789ABCDEF";
unsigned unum;/*中间变量*/
int i=0,j,k;
/*确定unum的值*/
if(radix==10&&num<0)/*十进制负数*/
{
unum=(unsigned)-num;
str[i++]='-';
}
else unum=(unsigned)num;/*其他情况*/
/*转换*/
do{
str[i++]=index[unum%(unsigned)radix];
unum/=radix;
}while(unum);
str[i]='\0';
/*逆序*/
if(str[0]=='-') k=1;/*十进制负数*/
else k=0;
char temp;
for(j=k;j<=(i-1)/2;j++)
{
temp=str[j];
str[j]=str[i-1+k-j];
str[i-1+k-j]=temp;
}
return str;
}
void init()
{
char str[10];//先打表
for(int i=1;i<=1000000;i++)//如果在数据范围内数满足这个条件就把相应的标记数组值变为1
{
itoa(i,str,10);
if(strstr(str,a)!=NULL||strstr(str,b)!=NULL)
s[i]=1;
else
s[i]=0;
}
}
int main()
{
int m,n,sum;
init();
while(scanf("%d%d",&m,&n))
{
if(m==0&&n==0)
break;
sum=0;
for(int i=m;i<=n;i++)//范围内遍历
{
sum+=s[i];
// cout<<sum<<" ";
}
cout<<sum<<endl;
}
return 0;
}