题目一:
题目描述:
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
解题思路:
为了得到数组中最大连续 1 的个数,需要遍历数组,并记录最大的连续 1 的个数和当前的连续 1 的个数。如果当前元素是 1,则将当前的连续 1 的个数加 1,否则,使用之前的连续 1 的个数更新最大的连续 1的个数,并将当前的连续 1 的个数清零。
遍历数组结束之后,需要再次使用当前的连续 1 的个数更新最大的连续 1 的个数,因为数组的最后一个元素可能是 1,且最长连续 1 的子数组可能出现在数组的末尾,如果遍历数组结束之后不更新最大的连续 1 的个数,则会导致结果错误。
代码实现
int findMaxConsecutiveOnes(int* nums, int numsSize) { int maxCount = 0, count = 0; for (int i = 0; i < numsSize; i++) { if (nums[i] == 1) { count++; } else { maxCount = fmax(maxCount, count); count = 0; } } maxCount = fmax(maxCount, count); return maxCount; }
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
解题思路:
我们只需要从1开始把所有可以整除n的约数全部加起来即可
- 约数就是能够被数字整除,而这里简化的一个思路是数字能够被整除,则除数和结果就都是约数,这种思路下,只需
要从1计算到平方根即可,为何是平方根看下面即可
比如:数字 8 , 能够整除 2 ,结果是 4 ,则除数 2 和结果 4 都是约数,而这两个只需要一次计算判断即可。
需要注意的是 4,9,25… 这种,除数和结果相同的情况,则除数或者结果只相加一次就够了
代码实现:
#include<stdio.h> #include<math.h> int find(int n) { int sum = 1; //因为i从2开始把1跳过了,所以sum等于1加回来 int i = 0; //这里为何可以开平方根呢? sqrt(n) //因为n被1到n-1之间任一整数整除时,两个因子有一个必定小于或等于 根号n // 另一个大于或等于根号n //例如16能被2,4,8整除,16=2*8,2小于4,8大于4,因此只需要判定1到根号n有无因子即可 for (i = 2; i <= sqrt(n);i++) { //这里i没有等于1是因为题目说除了自身以外的约数 if (n % i == 0) { //是否为约数 sum += i; int m = n / i; if (i != sqrt(n)) { //例如9=3x3,这是防止重复的数加进来 sum += m; } } } if (sum == n) { return 1; } else { return 0; } } int main() { int n = 0; while (scanf("%d", &n) != EOF) { int i = 0; int count = 0; //计数 for (i = 2; i <= n;i++) { //对n以内的数字都进行判断是否是完全数,注意1不参与判断 //原因是上面sum初始化成1了,如果i等于1的话85行代码sum==n int pan = find(i); //会多返回一次 if (pan) { count++; } } printf("%d\n", count); } return 0; }
结果情况:
符合题目要求,问题得到解决。
总结:
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!