本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。
今日练习题关键字:最大连续1的个数 完全数计算
博主csdn个人主页:小小unicorn
⏩专栏分类:C语言天天练
代码仓库:小小unicorn的代码仓库
关注我带你学习编程知识
给定一个二进制数组 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的约数全部加起来即可
#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;
}
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!