想问一下这个用于判断数字是否为质数以及寻找非质数的最大质因数的程序有没有问题
(我自己试了几个好像没什么问题,但不排除逻辑上有漏洞的情况)
#pragma once
#include<cmath>
template<class DataType>
class Prime
{
protected:
DataType mX;
public:
Prime(DataType x);
bool IsPrime();//判断是否为质数
int maxPrime();//求最大质因数
};
template<class DataType>
Prime<DataType>::Prime(DataType x)
{
mX = x;
}
template<class DataType>
bool Prime<DataType>::IsPrime()
{
int num = mX;
if (num == 2 || num == 3)return 1;
for (int i = 2; i <= sqrt(num); i++)
if (num % i == 0)return 0;
return 1;
}
template<class DataType>
int Prime<DataType>::maxPrime()
{
int num = mX;
int maxFactor;
maxFactor = sqrt(num);
if (num <= 1)
return 1;
while (num % 2 == 0)num /= 2;//剔除偶数
int k = 3;//从3开始,以2为步长,逐个递增筛选
while (num > 1 && k <= maxFactor + 1)//当一个数num的因数大于时sqrt(num),这个数一定是最大质因数
{
if ( num % k == 0)
{
num /= k;
maxFactor = sqrt(num);//是num的质因数,一定是num/k(可整除)的质因数,缩小问题规模
}
else
k += 2;//无法整除时,保证num递增
}
num = k;
return num;
}
#include "Prime.h"
#include <iostream>
using namespace std;
int main() {
long long x;
cout << "请输入需要判断的数字:";
cin >> x;
Prime<long long> P(x);
if (P.IsPrime())
cout << "是质数" << endl;
else
{
cout << "不是质数" << endl;
cout << "最大质因数为:" <<P.maxPrime()<< endl;
}
}