思维导图摘要

初学C,学到IF条件判断和FOR循环语句,彭老师甩过来一道寻找1000以内完全数的编程题并做了讲解。之后我整理并归纳了一下,写下这篇文章,来帮助自己进一步理清思路。
题为寻找1000以内的完全数,那么第一步就应该是如何判断一个数是完全数。弄懂完全数的定义,并由此找出其与其他数不一样的特点。由不一样的特点入手,找出完全数。
完全数的定义
该数所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
简而言之,真因子之和等于该数本身。
这是一个和其他数很不一样的特点,如果能抓住该特点,很好筛选出完全数。
那么第二步就是该特点的编程实现。
该特点的编程实现关键点在2点:1.是找出所有的真因子;
2.是因子和。
找出所有的真因子,又可分成2步:
一是如何找出因子;
二是知道找出因子的方法后,如何不遗漏,找出所有。
如何找出因子:数除以因子后余数为0
a%b==0
如何找出所有因子:FOR循环实现。
for(int b=1;b<a;b++)
{ if(a%b==0)
{printf("b is a factor of a");
}
}
以上实现了关键点一。
接下来是关键点二。借由IF条件判断,嵌套在FOR循环里,通过sum累加得到因子和。
for(int b=1;b<a;b++)
{if(a%b==0)
{sum+=b;
}
}
以下是判断是否完全数的完整程序
#include<stdio.h>
int main()
{
int i,sum=0,num;
printf(“请输入一个数”);
scanf("%d",&num);
for(i=1;i<num;i++)
{
if(num%i==0)
{sum+=i;
}
}
if(sum==num)
{printf("%d 是完全数",num);
}
return 0;
}
很明显的,上述程序分为输入数这一块和完全数判断这一块。
接下来便是如何在1000以内判断筛选完全数。还是FOR循环。
#include<stdio.h>
int main()
{
int i,sum=0;
for(int i=1;i<=1000;i++)
{ for(int a=1;a<i;i++)
{if(i%a==0)
{sum+=a;
}
if(sum==i)
{printf("%d",i);
}
}
return 0;
}
在实际情况中,上述程序的编译没有问题,最后却没有得出结果。经分析,问题出在sum=0的位置不对。
sum这个变量的初始化肯定在第一个FOR循环前,不然在FOR循环内,重复定义。只是sum=0,应位于第一个FOR循环内,第二个FOR循环前。sum是在第二个FOR循环内累加得到的因子和,在该FOR循环执行了一次后,应及时清零,好为接下来的第二次执行准备好条件。基于此思想,将sum=0置于第二个FOR循环后,第一个FOR循环内也是可行的,只是此时需第一个FOR循环前添加sum=0,为第二个FOR循环的第一次执行准备好条件。
网友评论