正约数之和

本文解析了一道算法题目,该题目要求计算1到n之间所有整数的正约数之和。通过输入一个正整数n,程序将输出这个范围内所有数的正约数总和。文中提供了一个高效的C++实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

我们把f(i)表示为i的正约数的和,而我们要求的是1<=i<=n之间所有i的f(i)之和!

输入

先输入一个正整数T,表示T个这是数据。T(T<=50)
每行输入一个正整数n。(n<10^6)

输出

输出一个数字,表示所求的数。

样例输入

复制
3
5
12
2018

样例输出

复制
21
127
3350309

#include<cstdio>
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
	    long long n;
		long long ans = 0;
	    scanf("%lld",&n);
	    
	    for (long long i=1; i<=n; ++i)
	    {
	        ans += (n/i)*i;
	    }
	    
	    printf("%lld\n",ans);
    }
    return 0;
}


### 计算一个数的所有约数之和 #### 背景介绍 在计算机科学领域,求解一个自然数的所有约数及其总和是一个常见的问题。通过遍历可能的因子并验证它们是否能整除目标数,可以有效地找出所有的约数[^1]。 #### 实现方法 以下是基于 C 语言的一种实现方式,该程序能够接收输入的一个自然数,并计算它的所有约数以及这些约数的总和: ```c #include <stdio.h> int main() { int n, i; long long sum = 0; printf("请输入一个自然数: "); scanf("%d", &n); printf("%d 的所有约数为:\n", n); for (i = 1; i <= n; ++i) { if (n % i == 0) { // 判断当前数值是否为约数 printf("%d ", i); sum += i; // 将约数累加到总和中 } } printf("\n%d 的约数之和为: %lld\n", n, sum); return 0; } ``` 上述代码的核心逻辑在于利用 `for` 循环逐一测试从 1 至给定数 \( n \) 中每一个数是否为其约数。如果某数 \( i \) 是 \( n \) 的约数,则将其加入到累积变量 `sum` 中[^3]。 为了提高效率,在某些情况下可以通过优化减少不必要的迭代次数。例如,仅需检查至平方根范围内的潜在因子即可发现完整的配对关系[^2]: ```c #include <stdio.h> #include <math.h> int main() { int n, sqrt_n; long long sum = 0; printf("请输入一个自然数: "); scanf("%d", &n); sqrt_n = (int)sqrt(n); // 获取平方根作为上限 for (int i = 1; i <= sqrt_n; ++i) { if (n % i == 0) { sum += i; // 添加较小的那个因子 if (i * i != n && i != 1) // 避免重复计入相同值或者自身 sum += n / i; // 同时加上较大的那个因子 } } printf("%d 的约数之和为: %lld\n", n, sum); return 0; } ``` 此版本减少了循环次数,从而提升了性能表现,尤其对于较大数值更为显著。 --- #### 数学原理补充说明 约数是指那些能够被某个特定整数完全整除而无余数的小于等于自身的其他整数们组成的集合成员之一项;而对于任意整数而言,它至少有两个基本性质——即自己本身与单位一皆属于自己的因数组成部分。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值