中奖计算

题目:中奖计算

某抽奖活动的规则是:每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。

例如:小张写的数字是:12345678,而开奖号码是:42347856。则称小张中了3个号,因为其中最长的相同连续位是:“234”。如果小张写的是:87654321,则他只中了一个号。

下面的代码根据传入的参数,返回中了几个号。其中:a表示被评价的号码,b表示摇号产生的数字。请填写缺少的代码。

把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。

int g(int a, int b)
{
	char sa[]="00000000";
	char sb[]="00000000";
	int n = 0;
	int i,j;
 
	sprintf(sa,"%8d",a);
	sprintf(sb,"%8d",b);
	for(i=0; i<8; i++)
	{
		for(j=1; j<=8-i; j++)
		{
			char t = ________;
			sa[i+j] = 0;
			if(strstr(sb, sa+i))
			{
				if(j>n) _________;
			}
			sa[i+j] = t;
		}
	}
 
	return n;
}

解题思路:首先,将两个传入的8位数整性通过sprintf分别转到sa,sb的字符串型。两层for循环,外层位控制遍历sa的子串长度,(例如i=0是,为sa[0]到sa[7]; i==1时,为sa[1]到sa[7]。。。),内层循环为控制遍历sa子串的子串(sa[0]到sa[1],sa[0]到sa[2]。。。sa[0]到sa[7]。。。),t作为记录sa[i+j]元素的变量,先将sa于i+j的位置进行截断,去前面的子串通过strstr()函数判断该字串是否也为sb的字串,如果是将该长度进行比较,最后取出最大值n。i和j也可以看作是两个标记,i为头,j在尾,后面取出的字串为i,j之间的字符串。

int g(int a, int b)
{
	char sa[]="00000000";
	char sb[]="00000000";
	int n = 0;
	int i,j;
 
	sprintf(sa,"%8d",a);
	sprintf(sb,"%8d",b);
	for(i=0; i<8; i++)
	{
		for(j=1; j<=8-i; j++)
		{
			char t = sa[i+j];
			sa[i+j] = 0;
			if(strstr(sb, sa+i))
			{
				if(j>n) n=j;
			}
			sa[i+j] = t;
		}
	}
 
	return n;
}

定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

定义说的有点羞涩难懂。举个例子就知道了。
比如:
char str2 = “cdef”;
char str1 = “abcdefgh”;
则通过函数,将返回
strstr(str1,str2) = cdefgh;

如果str1不包含有str2。
char str2 = “cxef”;
char str1 = “abcdefgh”;
则通过函数,将返回
strstr(str1,str2) = NULL;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值