等于其互异真因子之和的正整数称为完数。输入一个正整数,如果它是完数,则输出真因子和式。否则,输出“NO”。
#include <iostream>
#include <vector>
using namespace std;
void perfectNum(int n){
int sum = 1;
vector<int> factors;
for(int i = 2; i<= n/2; i++){
if(n%i == 0){
sum += i;
factors.push_back(i);
}
}
if(sum == n){
cout<<"真因子和式为:1";
for(int i = 0; i < factors.size(); i++)
cout<<" + "<< factors[i];
cout<<" = "<<n<<endl;
}
else
cout<<"NO"<<endl;
}
int main(){
int n;
cin>>n;
perfectNum(n);
return 0;
}
#include <iostream>
using namespace std;
int main() {
int n, sum;
cin >> n;
sum = 1; // 计算真因子和,初始值为1
for (int i = 2; i <= n / 2; i++) { // 从2开始枚举真因子
if (n % i == 0) {
sum += i;
}
}
if (sum == n) {
cout << sum << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
判断一个整数是否为一连串的整数之和:如,15=1+2+3+4+5;15=4+5+6;15=7+8
思路:等差数列之和Sn = (a1+an)n/2; an = a1 + n - 1; Sn=(2a1+n-1)*n/2; a1=Sn/2 + (1-n)/2; 判断a1是否为整数即可
判断代码
public class ConsistentSum
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
boolean flag = false;
for (int i = 2; i < input / 2 + 1; i++)
{
double init = (double) input / i + 0.5 - (double) i / 2;
if ((int) init == init && init > 0)
{
flag = true;
break;
}
}
if (flag)
{
System.out.println("yes");
}
else
{
System.out.println("no");
}
}
}
输出该连续正整数
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class ConsistentSumOut
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
for (int[] res: consistNums(input))
{
System.out.println(Arrays.toString(res));
}
}
/**
* 根据输入的正整数,输出所有连续的正整数
* @param input 输入
* @return 所有连续的正整数数组
*/
private static int[][] consistNums(int input)
{
List<Integer> list = consistCounts(input);
int[][] res = new int[list.size()][];
for (int i = 0; i < list.size(); i++)
{
res[i] = medianArray(list.get(i), input);
}
return res;
}
/**
* 根据输入的正整数,以及它可由多少个连续正整数之和组成,输出该连续的正整数
* @param nums 给定的正整数可有nums个连续的正整数构成
* @param input 输入的正整数
* @return 连续的正整数数组
*/
private static int[] medianArray(int nums, int input)
{
int[] res = new int[nums];
double first = (double) input / nums + 0.5 - (double) (nums / 2);
for (int i = 0; i < nums; i++)
{
res[i] = (int) first + i;
}
return res;
}
/**
* 根据输入的正整数判断有多少个连续的正整数之和可以组成该正整数,如15=1+2+3+4+5;15=7+8;15=4+5+6,则输出为5,2,3
* @param input 输入值
* @return 输出连续正整数个数列表
*/
private static List<Integer> consistCounts(int input)
{
List<Integer> res = new ArrayList<>();
for (int i = 2; i < input / 2 + 1; i++)
{
double init = (double) input / i + 0.5 - (double) i / 2;
if ((int) init == init && init > 0) // init > 0 条件是为了保证正整数之和,否则会存在负数的情况
{
res.add(i);
}
}
return res;
}
}
问题解答:
# 完数计算
def perfect_number(num):
factors = []
for i in range(1, num):
if num % i == 0:
factors.append(i)
if sum(factors) == num:
return factors
else:
return "NO"
# 测试
print(perfect_number(6)) # [1, 2, 3]
print(perfect_number(28)) # [1, 2, 4, 7, 14]
print(perfect_number(12)) # NO
解释:
定义一个 perfect_number()
函数,传入一个正整数 num
。首先定义一个空列表 factors
,用来存储真因子。然后从 1 循环到 num-1
,判断每个数是否是 num
的因数,如果是,则加入 factors
列表中。如果 factors
列表中所有数的和等于 num
,则说明 num
是完数,返回 factors
列表作为真因子和式;否则,返回字符串 "NO"。
测试了几个样例,输出了结果。