本蒟蒻的第四篇题解,望大家多多见谅!
P a r t Part Part 1 1 1 读题
编写程序求给定整数 n n n的“亲密对数”。“亲密对数”是指:若整数 a a a的因子(包括 1 1 1但不包括自身,下同)之和为 b b b,而整数 b b b的因子之和为 a a a,则称 a a a和 b b b为一对“亲密对数”。
要求:
使用函数,函数功能是:计算某一个数的因子(包括 1 1 1但不包括自身)之和。
n n n由键盘输入,如果存在“亲密对数”则输出该数,否则输出 N O NO NO。输入输出均在主函数中完成。
输入格式
一行,一个整数 n n n( i n t int int范围之内)
输出格式
输出一行,如题所述
输入样例1
220
输出样例1
284
输入样例2
8
输出样例2
NO
数据范围与提示
n ≤ 2147483647 n≤2147483647 n≤2147483647( i n t int int的最大值)
P a r t Part Part 2 2 2 思路
根据题意,可以知道一下两个公式:
1. a 1.a 1.a= b b b的因子和( b b b的因子和= a a a)
2. b 2.b 2.b= a a a的因子和( a a a的因子和= b b b)
现在我们只需要考虑因子和怎么算,就能编写代码啦!
这里给大家提供两种方法:
方法1:加上再去法
int factor(int x){
int s=0;
for(int i=1;i<=sqrt(x);i++){
//如果i是n的因子
if(x%i==0){
//直接加因子与其对应因子(与其相乘等于x)
s+=i+k/i;
//去重(举例:36的开方是6,会重复计算一次)
if(k==i||k==x)s-=k;
}
}
return s;
}
方法2:判断再加法
int factor(int x){
int s=0;
for(int i=2;i<=sqrt(x);i++){
//如果i是x的因子
if(n%i==0){
//判断两个因子是否相等
if(i!=x/i)s=s+i+x/i;
else s+=i;
}
}
}
由此,我们知道了因子和的计算方法,可以编写代码啦!
小tip:大家可以先根据思路,写一下代码哦!
P a r t Part Part 3 3 3 代码
注意:因子和计算部分想用方法2(判断再加法)的可自行上划复制哦!
#include<bits/stdc++.h>
using namespace std;
//详情内容见上Part2
int factor(int x){
int s=0;
for(int i=1;i<=sqrt(x);i++){
if(x%i==0){
s+=i+k/i;
if(k==i||k==x)s-=k;
}
}
return s;
}
int main(){
int a,b;
cin>>a;
//计算因子和
b=factor(a);
//相等就输出,不相等输出no
if(a==factor(b))cout<<b;
else cout<<"NO";
return 0;
}
P a r t Part Part 4 4 4 总结
本题考察因数和的计算方法,并作为子函数,在主函数中根据要求输出原数或" N o No No"
听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!