1. 奇妙的比值问题解析与实现
1.1 问题理解与数学原理
这个问题的核心是计算一个数的所有因子之和与该数本身的比值。数学上,这个比值被称为"丰度指数"(Abundance Index),可以用来判断一个数是亏数、完美数还是盈数:
- 比值=1:完美数(如6)
- 比值<1:亏数
- 比值>1:盈数
因子查找的优化原理:对于任意整数N,如果i是N的因子,那么N/i也必定是N的因子。因此我们只需要遍历到√N即可找出所有因子,时间复杂度从O(N)降低到O(√N)。
1.2 代码实现细节分析
cpp复制#include<iostream>
#include<iomanip> // 用于控制输出格式
using namespace std;
int main(){
int N;
while(cin>>N){
int s=0; // 因子和
for(int i=1;i*i<=N;i++){ // 只需遍历到平方根
if(N%i==0){
s+=i; // 添加小因子
int a=N/i;
if(a!=i){ // 避免重复添加平方数情况
s+=a; // 添加大因子
}
}
}
double ds=s;
double x=ds/N;
cout<<fixed<<setprecision(2)<<x<<endl; // 保留两位小数
}
return 0;
}
关键点说明:
- 使用i*i<=N代替i<=sqrt(N)避免浮点数运算
- 当i是N的因子时,N/i也是因子,但要避免i=N/i的重复情况
- 输出时使用fixed和setprecision保证小数点后两位
1.3 常见问题与调试技巧
注意:当N为完全平方数时,如16,因子4会被重复计算,必须添加if(a!=i)的判断
常见错误:
- 忘记初始化s=0,导致多组数据时累加错误
- 输出格式不正确,没有保留两
