求解C语言编程题。。。
展开全部
您好。我默认您程序限制时间为1s。您应该是初学者吧……不知道您数学水平如何,我就按照初/高的水平说了。
第一题:
首先要说的是题面描述有误,是所有真因子的和吧……
您可以先枚举一个数字j,我们知道如果j是数字i的因子的话,i一定是j的倍数,所以我们可以再枚举一个倍数关系k,2<=k<=10000/j,这样我们给每个i=j*k加上j的贡献,这个可以开一个数组存下来。最后再从1到10000跑一遍即可。
至于时间复杂度,您如果学过调和级数就会算出来其时间复杂度为O(n*ln(n))。
当然您要是觉得这个时间复杂度还是不够优秀,也是可以O(n)的。
代码:
#include "stdio.h"
using namespace std;
const int N=1e4+10;
int ans[N];
int main(){
for (int j=1;j<=10000;++j)
for (int k=2;k<=10000/j;++k)
ans[k*j]+=j;
for (int i=1;i<=10000;++i)
if(ans[i]==i) printf("%d%c",i,i==10000?'\n':' ');
}
/*输出:6 28 496 8128*/
第二个题:
……这个我就直接贴代码吧……
#include "stdio.h"
using namespace std;
double a[10];
int main(){
for (int i=1;i<=8;++i)
scanf("%f",a+i);
for (int i=1;i<=8;++i)
for (int j=i+1;j<=8;++j)
if(a[i]>a[j]) {
double t=a[i];
a[i]=a[j],a[j]=t;
}
for (int i=1;i<=8;++i)
printf("%.8f%c",a[i],i==8?'\n':' ');
}
/*输出:6 28 496 8128*/
追问
谢谢您
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询