C语言每日一练----Day(12)

简介: C语言每日一练----Day(12)

题目一:

题目描述:

给定一个二进制数组 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;
}

结果情况:

符合题目要求,问题得到解决。

总结:

文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。

希望今天的练习能对您有所收获,咱们下期见!

相关文章
|
6月前
|
存储 人工智能 安全
C语言:选择+编程(每日一练Day15)
C语言:选择+编程(每日一练Day15)
87 2
|
6月前
|
C语言
C语言:选择+编程(每日一练Day13)
C语言:选择+编程(每日一练Day13)
62 0
|
6月前
|
测试技术 C语言
C语言每日一练Day03——移除元素
C语言每日一练Day03——移除元素
|
6月前
|
C语言
C语言每日一练——Day02:求最小公倍数(3种方法)
C语言每日一练——Day02:求最小公倍数(3种方法)
|
6月前
|
C语言
C语言每日一练——Day01:求最大公约数(三种方法)
C语言每日一练——Day01:求最大公约数(三种方法)
|
6月前
|
存储 人工智能 C语言
C语言:选择+编程(每日一练Day16)
C语言:选择+编程(每日一练Day16)
64 3
|
6月前
|
C语言
C语言:选择+编程(每日一练Day14)
C语言:选择+编程(每日一练Day14)
63 2
|
6月前
|
编译器 C语言
C语言:选择+编程(每日一练Day12)
C语言:选择+编程(每日一练Day12)
55 2
|
6月前
|
C语言
C语言:选择+编程(每日一练Day11)
C语言:选择+编程(每日一练Day11)
50 2
|
6月前
|
C语言
C语言:选择+编程(每日一练Day10)
C语言:选择+编程(每日一练Day10)
57 1