C语言 精选真题7(难)

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中有无重复元素进而做出操作。
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值