NYOJ 975 关于521(strchr()函数与strstr()函数的学习)

关于521

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。

浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到521三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210

输入
多组测试数据:
一行给定两个数a,b(0<a,b<1000000),表示数字的开始和结束。
输出
一行显示他想要知道的数有几个及显示有多少个数字令他特别的愤怒。用空格隔开。
样例输入
200 500
300 900
1 600
样例输出
Case 1:2 0
Case 2:2 1
Case 3:6 1


题目比较难,不看长木的博客根本解不出来。我觉得我要改改不思考,老看别人代码的习惯了。

通过这道题也学习了一下strchr(),strstr()两个函数:


头文件:都包含在#include<string.h>中


strchar函数:原型:char * strchr(char * str, int ch); 功能就是找出在字符串str中第一次出项字符ch的位置,找到就返回该字符位置的指针(也就是返回该字符在字符串中的地址的位置),找不到就返回空指针(就是 null)。


strstr函数:char * strstr(char * str1,char * str2);功能就是找出在字符串str1中第一次出项字符串str2的位置(也就是说字符串sr1中要包含有字符串str2),找到就返回该字符串位置的指针(也就是返回字符串str2在字符串str1中的地址的位置),找不到就返回空指针(就是 null)。


解题思路:先把数字存入字符串,注意:字符串与数字的顺序是反转过来的。在利用strchr()函数和strstr()函数找到该字符串中是否

    含有125,或1,2,5。再将每个数字的检索结果打表出来。

具体代码如下:

#include<stdio.h>
#include<string.h>
#define max 1000010
int a[max]={0},b[max]={0};
char str[10];

void IntToString(int n)
{
	int i=0;
	while(n)
	{
		str[i++]=n%10+'0';
		n=n/10;
	}
	str[i]='\0';//注意字符串与数字的顺序相反 
}

int strCmp()
{
	if(strstr(str,"125"))
	   return 2;
    if(strchr(str,'1')&&strchr(str,'2')&&strchr(str,'5'))
	   return 1;
    return 0;
}

int main()
{
	int x,y,i,t,j=1;
	for(i=125;i<max;i++)
	{
		IntToString(i);
		t=strCmp();
		if(t==2)
		{
			a[i]=a[i-1]+1;
			b[i]=b[i-1]+1;
		}
		else if(t==1)
		{
			a[i]=a[i-1]+1;
			b[i]=b[i-1];
		}
		else
		{
			a[i]=a[i-1];
			b[i]=b[i-1];
		}
	}
	while(scanf("%d%d",&x,&y)!=EOF)
	{
		printf("Case %d:%d %d\n",j,a[y]-a[x-1],b[y]-b[x-1]);
		j++;
	}
	return 0;
}


你可能感兴趣的:(NYOJ 975 关于521(strchr()函数与strstr()函数的学习))