数学问题:完数
来源:互联网 发布:算法式和启发式区别 编辑:程序博客网 时间:2024/06/05 03:23
问题描述:
求1到10000之内所有的完数,并表示出来;
样例输出:
6 : 1 2 3;
28 : 1 2 4 7 14;
496 : 1 2 4 8 16 31 62 124 248;
8128 : 1 2 4 8 16 32 64 127 254 508 1016 2032 4064;
共找到 4 个完数;
问题分析:
1、完数:一个数恰好等于其因子之和的数;
2、使用穷举法,穷举1到10000中的所有数num;
3、对穷举的每一个数进行因数分解(所有的因子存入数组arr[]中,以便后序输出)再求和判断(这部分可使用原数(s = num)减去每一个因子,如果减完所有因子之后刚好为零(s == 0)则为完数);
4、按例输出;
完整代码:
#include <iostream>using namespace std;int arr[300] = {0};int code = 0;void show(int num, int count){ cout << num << " : " ; for (int j(0); j < count; ++j) { cout << arr[j]; if (j < count - 1) cout << " "; } cout << endl;}int judge(int num){ int count = 0; int s = num; for (int i(1); i < num / 2 + 1; ++i) { if (num % i == 0) { arr[count++] = i; s -= i; if (s <= 0)// if ( s < 0) break; } } if (s == 0) { code++; show(num, count); } return code;}int main(){ int perfect_number = 0; for (int num(2); num < 10000; ++num) perfect_number = judge(num); cout << "there have " << perfect_number << " perfect numbers !" << endl; return 0;}
代码分析:
main() 用于遍历1-10000的所有数,并调用judge进行判断;
int judge(int num); 用于判断传入的数是否为完数:
23-26行:分离num所有因子,并存入数组arr;此条注意:在这部分数组的大小一定要足够足够大,否则在进行因子分解的时候,遇到不是完数的num是存入因子时会造成数组越界,导致程序出错;
28(29)行:作为是否继续分解的控制条件,如果这个数减他的因子小于或已经等于零后面就不必继续分解,节省计算资源;此条注意:在这部分控制条件虽理论上应是小于等于,但编程时一定不能是小于等于,如果为小于等于会出现:当num循环到24时,分解的因子应有: 1 2 3 4 6 7 8 12;但由于判断条件为<=所以当分解到8时 s-i == 0 已然停止分解,接着程序进入34行判断,此时s == 0 所以24会被当成一个完数输出,这明显是错的,判断条件应为 “<”;
void show(int num, int count);用于格式输出相应的完数和它的因子;传入count便于输出所有所存因子;
结果展示:
(http://img.blog.csdn.net/20160815110231306)
当判断条件为 s <= 0时的结果:
(http://img.blog.csdn.net/20160815110325437)
- 数学问题:完数
- 数学问题——找“完数”
- 数学问题:亲密数
- [NOIP] [组合数学] NOIP2016Day2 组合数问题
- 数学问题——找“亲密数”
- 数学问题——找“水仙花数”
- 数学问题——找“自守数”
- 数学基础:HUD1406-完数
- hdu1406 完数(数学:求因子之和)
- C语言初级例题数学问题——水仙花数
- noip2016 Day2 T2-组合数问题-组合数学-前缀和
- 数学问题——求回文平方数
- 1056组合数的和(数学问题)
- 卡特兰数在多种问题下的应用 组合数学-Catalan数
- 数学问题
- 数学问题
- 数学问题
- 数学问题
- 在Myeclipse中添加代码提示功能
- Linux实用命令
- 某大数据平台挂载硬盘过程
- [leetcode] 11. Container With Most Water
- Android-ListView 学习笔记
- 数学问题:完数
- Universal-Image-Loader源码阅读(4)-utils/ImageSizeUtils
- NYOJ 14 会场安排问题
- 判断当前日期是否在[startDate, endDate]区间
- 优化mysql数据库的方法
- html delegate、live方法
- LightOJ1104Birthday Paradox(思维+数学)
- 最后一公里极速配送(二)
- 谨慎注意WebBrowser控件的DocumentCompleted事件