【问题描述】
给出一个正整数n,求一个和最大的序列a0,a1,a2,……,ap,满足n=a0>a1>a2>……>ap,
且a(i+1)是ai的约数,输出a1+a2+……+ap的最大值
【输入格式】
输入仅一行,包含一个整整n
【输出格式】
一个正整数,表示最大的序列和,即a1+a2+……+ap的最大值
【样例输入】
10
【样例输出】
6
【数据规模与约定】
1<n<=10^6
【样例说明】
p=2
a0=10,a1=5,a2=1,6=5+1
【思路分析】
核心就是求出n的最大约数;
初始设最大序列和为sum=0;
求出n的最大约数m后,sum+=m;再把最大约数m赋值给n;
序列循环的最终的条件就是n==1;所以循环的条件就是n!=1;
m的初始值设置为n/2,因为无论对于奇数还是偶数来说,它的最大约数都<=n/2;寻找最大约数的条件就是m>0;因为无论对于质数还是合数它最小的约数都是1;
具体详见代码:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int m,sum=0; //n表示在序列中当前的数,m表示在序列中下一个数
while(n!=1){
for(m=(n/2);m>0;m--){
if(n%m==0){ //找到最大约数后,令n=m
sum+=m;
n=m;
break;
}
}
}
printf("%d",sum);
return 0;
}