亲密数

Posted 20175317zrw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了亲密数相关的知识,希望对你有一定的参考价值。

亲密数

需求分析

本项目的关键是判断区间内的每一个数是否满足亲密数的定义。亲密数的定义是:如果a的所有正因子和等于b,b的所有正因子和等于a,因子包括1但不包括本身,且a不等于b,则称a,b为亲密数对(参考百度百科对亲密数的解释)

功能设计

  • 基本功能:查找、判断并输出亲密数
  • 扩展功能:输入一个区间的两个端点,判断该区间内是否存在亲密数,根据判断输出相应的结果

设计实现

首先定义两个变量a,b,存储用户输入的区间头和尾,之后使用for循环遍历区间,逐个判断其真因子和是否等于它本身,如果不相等继续判断其真因子和的真因子和是否等于它本身,如果有的话输出该数和他的真因子和,同时计数变量count的值加一,最后判断计数变量count的值是否等于初值,如果相等说明区间内未找到亲密数,输出提示“该区间内没有亲密数”。

测试运行

正常情况

技术图片

异常情况

技术图片

核心代码

        for (int i=a;i<=b ;i++) {   //遍历a到b
            for(int j=1;j<i;j++){   //遍历比该数小的正整数
                if(i%j==0) {        //如果j是i的因子
                    total1 = total1 + j;  //total1是在循环外定义的,初值为0,用于计算真因子和
                }
            }
            if(total1!=i){      //如果真因子和不等于它本身
                for(int k=1;k<total1;k++){   //遍历1到total1
                    if(total1%k==0) {        //如果k是total1的因子
                        total2 = total2 + k;  //total2是在循环外定义的,初值为0,用于计算total1的真因子和
                    }
                }
                if(total2==i &&  i<total1){    //如果i的所有正因子和等于total1,total1的所有正因子和等于
                    System.out.println(i+"和"+total1+"是一对亲密数");
                    count++;
                }
            }
            total1=0;      //重置total1
            total2=0;      //重置total2
        }

总结

这个项目与完全数的求解大致过程较为相似,所以我直接使用了完全数的模板,修改了其中的核心部分代码。此过程我节省了大量时间,这启示我在实现项目的同时要多动脑子,这样可以少走许多弯路。

PSP

步骤 耗时(min) 百分比
需求分析 15 33.3%
设计 5 11.1%
代码实现 5 11.1%
测试 5 11.1%
分析总结 15 33.3%

以上是关于亲密数的主要内容,如果未能解决你的问题,请参考以下文章

算法15---数论2---亲密数

亲密数

亲密数对递归求逆

5.20亲密数

C语言试题六十八之请编写函数实现亲密数

C语言试题六十八之请编写函数实现亲密数