贵阳房地产网站建设,如何介绍设计的网站模板,企业网站开发说明,手机建网站步骤蓝桥杯原题#xff1a; 一个数如果恰好等于它的因子之和#xff0c;这个数就称为“完数”。例如6 1 2 3.编程找出1000以内的所有完数。 这个题没有很大的难点#xff0c;与我们上一个解决的问题“质因数分解”不同#xff0c;它不需要判断因数是否是质数#xff0c;因此…蓝桥杯原题 一个数如果恰好等于它的因子之和这个数就称为“完数”。例如6 1 2 3.编程找出1000以内的所有完数。 这个题没有很大的难点与我们上一个解决的问题“质因数分解”不同它不需要判断因数是否是质数因此我们的工作量会小很多。
现在我们的想法还是类似首先找到一个数字所有的真因子这可以靠for循环之类的东西解决尤其是因为需要找的是真因子因此需要把这个数字本身排除掉也就是说我们设置for的时候要让那个控制参数小于数字本身以防止数字本身混进去。
然后我们要把它们作为“候补因子Candidate factors”存入一个数组arr中。
注意事实上我们可以取消arr的过程就好像我们质因数分解的题目里面也有办法取消这个存储的过程直接用sum该数就可以解决然而这次为了解释清楚我们的行为逻辑先不进行该升级之后我会把不需要arr的方案给出这次我们先进行需要arr存储候补因子的方案解释。
下一步我们把这些候补因子全部加起来存入整型变量sum中这时候我们已经找到了数字所有真因子之和只需要判断这个和是否与数字本身相等如果相等说明数字是完数于是我们用printf输出它如果不是则不输出它。
将以上所有过程套上一个for循环就可以检查从1开始直到1000所有的数字并找出其中的完数事实上你可以再用一个scanf控制的变量替代1001的位置这样你就可以检验任意位置以内的所有完数。
下面我们展示完整的代码
#includestdio.h
int main()
{int num 2;int fac 1;int arr[200] { 0 };int t 0;int sum 0;for (num 2; num 1001; num) {for (fac 1; fac num; fac) {if (num % fac 0) {arr[t] fac;t;}}while (t 0) {sum arr[t];t--;}if (sum num) {printf(%d\n, num);}t 0; sum 0;for (t 0; t 200; t) {arr[t] 0;}t 0;}return 0;
}
如果你决定尝试上面提到的那个可以检验任意位置以内的完数的方法的话请不要忘记加上一句“#define _CRT_SECURE_NO_WARNINGS”以防止scanf报错说不安全或者直接使用scanf_s但是我个人是不喜欢用scanf_s的因为严谨点讲用这个东西要输入的参数更多你必须输入三个参数而不是两个这给我们带来一些麻烦。