您的位置:首页 > 其它

NEUQ-OJ:1177 亲和数

2017-12-16 14:06 20 查看

亲和数

思路

一道模拟题,依然是跟着题意一步步执行即可。

因为一个数的所有因数都会小于等于自己的大小,而本题要求是除了自己以外,所以我们可以用一个循环从1到n-1找一遍就可以拿到所有的因数了。时间复杂度为O(n)。

我们还可以进一步优化。因数都是成对的,比如220的因数:

1 2 4 5 10 11 20 22 44 55 110 220

其中:

1*220=220

2*110=220

4*55=220



所以我们只需要找到一个因数就可以确定与之对应的另外一个。因为1是每个数字都包含的因数,所以我们只需要从2顺序查找到n√即可。当然这里要做个特判,如果是平方数,那么它的因数n√只有一个不能重复相加。

时间复杂度为O(n√)。

关键的部分代码

int c=1;
cin>>a;
for(int j=2;j<sqrt(a);j++)
{
if(a%j==0)
{
if(a/j==j) c+=j;
else c+=j+a/j;
}
}


两个数都执行了一样的步骤找好了因数相加完了以后判断是否和对方相等就可以了。这部分比较简单不再赘述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  作业