题目:中奖计算
某抽奖活动的规则是:每位参与者在纸上写下一个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;