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

本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。

今日练习题关键字:最大连续1的个数 完全数计算

在这里插入图片描述

博主csdn个人主页:小小unicorn
⏩专栏分类:C语言天天练
代码仓库:小小unicorn的代码仓库
关注我带你学习编程知识

Day1

  • 题目一:
    • 题目描述:
    • 解题思路:
    • 代码实现
    • 结果情况:
  • 题目二:
    • 题目描述:
    • 解题思路:
    • 代码实现:
    • 结果情况:
  • 总结:

题目一:

题目描述:

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。

C语言每日一练----Day(12)_第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;
}

结果情况:

C语言每日一练----Day(12)_第2张图片
符合题目要求,问题得到解决。

题目二:

题目描述:

完全数(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
#include
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;
}

结果情况:

在这里插入图片描述
符合题目要求,问题得到解决。

总结:

文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!

你可能感兴趣的:(c语言天天练,c语言,C语言每日一练)