实例 18 求完数

来源:互联网 发布:mac压缩文件怎么打开 编辑:程序博客网 时间:2024/05/16 19:24

其实这个小题目也很简单,本来也没什么可说的,只是总结一下思路。

先来看题目,题目要求判读一个数字是否是完数。首先得知道完数是啥吧。简单来说,一个自然数的真因子之和等于它本身。比如6=1+2+3.真因子概念注意一下即可。

对于这中判断类的问题,最重要的就是找到判读条件,至于存储格式,打印格式是后来要考虑的细节问题,刚开始找思路的时候不要太在意(如果你很牛逼啦,那也无所谓,因为你可以一眼看穿这个问题,连各种实现细节都考虑的很清楚),大部分人还是要靠改代码来提高的。

上面已经说道,根据判断条件来判读是否是完数。那么看看条件是啥。首先是一个自然数 ,这个好解决,整形变量基本可以解决了,控制一下输出范围即可。

其次是判段它的真因子之和。一个必然的事实摆在我们面前,一个数字的真因子可能不止一个,但是要求我们比较真因子之和是否等于数字本身,解决??产生了两个问题,如何存储真因子?如何求和于数字本身就行比较?把这两个问题解决了本题也就没用任何难点了。

既然真因子个数可能不唯一,那么用啥来存储呢?想了想,只有数组最合适了吧,总不能声并且数组求求和很简单嘛明未知多个变量来存储吧。所以用数组是最靠谱的。暂时定下这个思路了。

下面第二个问题,要把真因子的和求出来同数字本身进行比较,相等的才是完数,不相等的不是完数。下面就是解决求和的问题了。求和好办啊,加起来不就行了嘛。那么问题又来了,首先不知道有多少个真因子啊,我们虽然上面想到用数组来存储但是没解决数组长度的问题啊。怎么办?如何知道数组长度?这个时候就要用到一个小技巧了,计数器!!设置一个初始值为0的变量,在循环的里面求真因子的时候,如果能求出一个,那么就把这个变量加一,同时数组也加一,那么还有一个问题,数组在申请时要求是固定长度的,但是根本不知道有多少个真因子,即数组也要是动态的。这里就涉及到动态内存分配问题,具体的就不说了。当然你也可以直接把存储真因子大小的数组设置一个最大长度,比如数字本身大小,真因子的个数肯定不会超过的。

下面上参考代码,请注意是参考,在我的机器上运行成功了。

#include<iostream>using namespace std;int main() {int Number;int sum = 0;cout << "Please input a number:" << endl;cin >> Number;int* ZhenYinZi = new int[Number];int index = 0;ZhenYinZi[0] = 0;for (int i = 1; i < Number; i++){if (Number%i == 0){index++;ZhenYinZi[index] = i;}}for (int k = 0; k <= index; k++){sum += ZhenYinZi[k];}delete [] ZhenYinZi;ZhenzYinZi=NULL;if (sum == Number)cout << "The number is wanshu" << endl;elsecout << "The number is not wanshu" << endl;return 0;}

下面介绍第二种存储真因子的方法。这个方法不要求设置辅助变量,进行统计有多少个真因子。这个方法基于一个事实,即真因子的个数不会大于数字本身吧。那就好办了,现在我们就设置一个同数字本身大小一样的数组,但是请注意进行初始化为0,一定要为0。初始化后,在循环里面进行查找真因子。这个样求出来的真因子数组可能很大,但是求和的时候不影响啊,因为别的我们都设置为0啦,所以我们是可以算出真因子的和的。

上代码:

#include<iostream>using namespace std;int main(){    int Number;    int sum = 0;    cout << "Please input a number :" << endl;    cin >> Number;    int *ZhenYinZi = new int[Number];    for (int i = 0; i < Number; i++){        ZhenYinZi[i] = 0;    }    for (int i = 1; i < Number; i++){        if (Number%i == 0){            ZhenYinZi[i] = i;        }    }    for (int i = 0; i < Number; i++){        sum += ZhenYinZi[i];    }    delete[]ZhenYinZi;    ZhenYinZi = NULL;    if (sum == Number)        cout << "The number is wanshu" << endl;    else        cout << "The number is not wanshu" << endl;    return 0;}

本次博客到此结束了,下次抽空继续写!

0 0
原创粉丝点击