# Number Theory# Factorization# Brute Force# Math

c184 - 盈虧互補

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定的數字 n 是否為完全數,如果不是,則判斷是否存在一個數字 m,使得 nm 互為友好數。如果存在,輸出 nm 是友好數,否則輸出 n 沒有朋友。

解題思路

首先,計算 n 的真因數和。如果真因數和等於 n,則 n 是完全數。如果不是,則尋找一個數字 x,其真因數和等於 n。如果找到這樣的 x,則 nx 是友好數。尋找 x 的過程是通過遍歷可能的因數來計算 x 的真因數和,並判斷其是否等於 n

複雜度分析

  • 時間複雜度: O(sqrt(n))
  • 空間複雜度: O(1)

程式碼

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n;
	while (cin>>n,n!=0){
		int x=1,y=1;
		double sn=sqrt(n);
		for(int i=2;i<=sn;i++){
			if(n%i==0 && i!=sn) {
				x+=i; 
				x+=n/i;
			}
			else if(n%i==0 && i==sn) x+=i;
		}
		if(x==n) cout << "=" << n << "\n";
		else{
			double sm=sqrt(x);
			for(int i=2;i<=sm;++i){
				if(x%i==0 && i!=sm) {
					y+=i; 
					y+=x/i;
				}
				else if(x%i==0 && i==sm) y+=i;
			}
			if(y==n) cout << x << "\n";
			else cout << "0\n";
		}
	}
}

Discussion