本篇文章將從數學概念的角度、常用算法的應用、程序實現的方法等多個方面,對整數的因子包含自身的問題進行詳細闡述。
一、質因數分解法
將整數進行質因數分解,若分解結果中所有質因子的指數都不為0,則該整數的因子包含自身;否則,不包含自身。這一方法的時間複雜度為O(log(n))。
#include <iostream>
#include <vector>
using namespace std;
vector<int> PrimeFactors(int n) {
vector<int> factors; //存儲質因數
for (int i = 2; i * i <= n; ++i) {
while (n % i == 0) {
factors.push_back(i);
n /= i;
}
}
if (n > 1) factors.push_back(n); //n為質數時也要記錄
return factors;
}
bool ContainsSelf(int n) {
vector<int> factors = PrimeFactors(n);
vector<bool> used(factors.size(), false); //標記數組,初始均為false
for (int i = 0; i < factors.size(); ++i) {
for (int j = i + 1; j < factors.size(); ++j) {
if (factors[j] % factors[i] == 0) used[j] = true; //factors[j]包含factors[i],標記j
}
}
for (int i = 0; i < factors.size(); ++i) {
if (!used[i]) return true; //如果有質因子未被標記,說明包含自身
}
return false;
}
int main() {
int n;
cin >> n;
if (ContainsSelf(n)) cout << n << "的因子包含自身。";
else cout << n << "的因子不包含自身。";
return 0;
}
二、暴力算法
對於一個整數n,從1到n-1不斷枚舉它的因子,如果它的因子中包含n本身,則說明它的因子包含自身。時間複雜度為O(nlog(n))。
#include <iostream>
using namespace std;
bool ContainsSelf(int n) {
int sum = 0; //因子之和
for (int i = 1; i < n; ++i) {
if (n % i == 0) sum += i;
}
return (sum % n == 0);
}
int main() {
int n;
cin >> n;
if (ContainsSelf(n)) cout << n << "的因子包含自身。";
else cout << n << "的因子不包含自身。";
return 0;
}
三、素數判定法
如果一個整數n為素數,並且(n-1)可以被4整除,則n的因子包含自身。這一方法的時間複雜度為O(sqrt(n))。
#include <iostream>
using namespace std;
bool IsPrime(int n) { //素數判定函數
if (n < 2) return false;
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0) return false;
}
return true;
}
bool ContainsSelf(int n) {
if (!IsPrime(n)) return false;
int m = n - 1;
while (m % 2 == 0) m /= 2; //計算(n-1)/2^k
return (m % 4 == 0); //(n-1)/2^k能否被4整除
}
int main() {
int n;
cin >> n;
if (ContainsSelf(n)) cout << n << "的因子包含自身。";
else cout << n << "的因子不包含自身。";
return 0;
}
四、結語
本文介紹了三種判斷整數的因子是否包含自身的方法。其中,質因數分解法時間複雜度相對較低,且易於實現;暴力算法雖然代碼簡單,但時間複雜度較高,不適合處理大型數據;素數判定法則更適用於判斷較大的整數。具體使用時,建議根據具體的需求和數據規模選擇合適的方法。
原創文章,作者:HWPZE,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/375075.html