int fun(int a[], int n)
{ int c[1000]={0}; /* 计数器,每个数的出现次数 */count
int t[1000]; /* 去掉重复后的整数系列 */tally
int k=0,i,j, lucky;
for (i=0; i<n; i++)//遍历目标数组a
{
for (j=0;j<k;j++)//k的作用相当于sum;用于计算t数组中元素;
if (a[i] == t[j])
{
c[j]++;
break;
}
if (j>=k)
{ t[k] = a[i];
c[k] = 1;
k++;
}
}
lucky = -1;
/* 请在此处填入必要的代码,找出最大幸运数 */
for(i=0;i<k;i++)
{
if(t[i]==c[i])//满足幸运数的定义
{
if(t[i]>=lucky)//并且是最大幸运数
{
lucky=t[i];
}
}
}
return lucky;
}
/*
在这段代码中,目的是找到数组 a 中的“幸运数”,即数组中出现次数与其数值相等的元素,并且要找到其中最大的一个。这里有几个重要的知识点和注意事项:
1.数组初始化:
int c[1000]={0}; 这行代码初始化了一个大小为1000的数组 c,并将所有元素初始化为0。这是用来计数每个不同数值在数组 a 中出现的次数。
int t[1000]; 这行代码声明了一个大小为1000的数组 t,用来存储去重后的数组元素。
2.去重并计数:
通过两层循环,外层循环遍历原数组 a,内层循环检查当前元素 a[i] 是否已经存在于数组 t 中。
如果存在(即 a[i] == t[j]),则相应的计数器 c[j] 加1。
如果不存在(即内层循环正常结束,j >= k),则将 a[i] 添加到 t[k],并将对应的计数器 c[k] 设置为1,然后 k 自增以记录新的不同元素。
3.寻找幸运数:
幸运数的定义是元素的值等于它在数组中出现的次数。
通过遍历数组 t 和对应的计数器数组 c,检查 t[i] == c[i] 的条件是否满足。
如果满足,并且 t[i] 大于当前记录的最大幸运数 lucky,则更新 lucky。
*/
/*仔细对比两个函数 Func 和 fun,我们可以发现它们在大体逻辑上是相似的,但存在几个关键的不同点:
1.变量初始化:
在 Func 中,int c[1000]=0; 和 int t[1000]=0; 这两行代码实际上是有问题的。在C语言中,这样只能将数组的第一个元素初始化为0,其余元素将保持未初始化的状态(可能是任何值)。正确的初始化应该是使用循环或者像 fun 函数那样使用 {0} 来初始化整个数组。
在 fun 中,int c[1000]={0}; 正确地初始化了数组 c 的所有元素为0。
2.变量 k 的初始化:
在 Func 中,变量 k 没有被显式初始化。在C语言中,局部变量如果没有初始化,其值是未定义的(可能是任何值)。这会导致程序的行为不可预测。
在 fun 中,变量 k 被正确地初始化为0。
3.循环结束后的 k++:
在 Func 中,k++ 语句没有放在任何控制结构(如 if 语句)的内部,这意味着无论内层循环是否因为找到匹配项而 break,k 都会递增。这是不正确的,因为当找到一个匹配项时,我们不应该增加 k 的值。
在 fun 中,k++ 语句正确地放在了 if (j >= k) 的内部块中,只有在找到一个新元素(即当前元素不在 t 数组中)时,k 才会递增。
4.条件判断:
在 Func 的第二个循环中,if(t[i]=c[i]) 是一个赋值表达式,而不是比较表达式。它应该使用 == 来进行比较,即 if(t[i] == c[i])。
在 fun 中,这个比较是正确的。
*/
/*
k的作用:
作为标志,能够指示当前t数组中的长度;
保证循环变量会超出当前数组长度,便于通过判断t中有无重复元素进而做出操作。
*/
C语言 精选真题7(难)
于 2024-11-12 15:31:27 首次发布