求因数和、因数个数

本文介绍如何使用C++编程求解整数的因数及其和与个数。例如,输入整数10,输出其因数1、2、5、10,因数和18,因数个数4。

求因数和、因数个数

题目描述
请求出一个整数n有哪些因数(因数就是能够被n整除的数),请输出这些因数,并求出这些数的总和、总个数;
比如,如果输入整数10,那么输出如下:
1
2
5
10
18
4
其中:1 2 5 10,输出的是10的因数,18代表的是这几个因数的和,4代表的是10因数的个数。
输入
一个整数n(n<=10000)
输出
先输出若干行,每行一个整数,代表n的因数;
再输出一行,有1个整数,代表n因数的和;
最后输一行,有1个整数,代表n因数的个数;
样例输入复制
10
样例输出复制
1
2
5
10
18
4

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
	int i=1;
	int s=0,sum=0;
	cin>>n;
	while(i<=n) {
		if(n%i==0) {
			cout<<i<<endl;
			s++;
			sum=sum+i;
			i++;
		} else {
			i++;
		}
	}
	cout<<sum<<endl<<s;
	return 0;
}
个数所有因数可以采用以下几种常见方法: ### 枚举法 从 1 开始,依次判断该数能否被 1 到该数本身的每个整数整除,如果能整除,则这个整数就是该数的因数。以 360 为例,从 1 开始枚举: ```python num = 360 factors = [] for i in range(1, num + 1): if num % i == 0: factors.append(i) print(factors) ``` 这种方法简单直接,但对于较大的数,效率较低,因为需要遍历从 1 到该数本身的所有数。 ### 分解质因数法 先将该数分解为质因数的乘积形式,然后根据质因数的组合情况出所有因数。例如对于一个数 \(N = p_1^{a_1} \times p_2^{a_2} \times \cdots \times p_m^{a_m}\)(其中 \(p_i\) 为质数,\(a_i\) 为对应的指数),其因数可以通过 \(p_1^{b_1} \times p_2^{b_2} \times \cdots \times p_m^{b_m}\)(\(0 \leq b_i \leq a_i\))的形式组合得到。 以下是一个 Python 实现示例: ```python def prime_factors(n): factors = [] divisor = 2 while n > 1: while n % divisor == 0: factors.append(divisor) n = n // divisor divisor = divisor + 1 return factors def all_factors(n): prime_f = prime_factors(n) unique_prime = list(set(prime_f)) exponents = [prime_f.count(p) for p in unique_prime] num_factors = 1 for exp in exponents: num_factors *= (exp + 1) all_f = [] for i in range(num_factors): factor = 1 temp = i for j in range(len(unique_prime)): exp = temp % (exponents[j] + 1) factor *= unique_prime[j] ** exp temp //= (exponents[j] + 1) all_f.append(factor) all_f.sort() return all_f num = 360 print(all_factors(num)) ``` 这种方法通过先分解质因数,再根据质因数的指数组合出所有因数,效率相对较高,尤其是对于较大的数。 ### 优化枚举法 可以只枚举到该数的平方根,因为如果 \(a\) 是 \(n\) 的因数,那么 \(\frac{n}{a}\) 也是 \(n\) 的因数。例如: ```python import math num = 360 factors = [] sqrt_num = int(math.sqrt(num)) for i in range(1, sqrt_num + 1): if num % i == 0: factors.append(i) if i != num // i: factors.append(num // i) factors.sort() print(factors) ``` 这种方法将枚举范围缩小到平方根,减少了不必要的计算,提高了效率。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值