素因子的分解:首先考虑一下,分解的唯一性,对于一个正整数而言,写成一些素因子相乘的式子是唯一的。
写成的形式可以如下:
12=2*2*3
12=2^2*3^1
对于第二种情况只是需要一个计数的变量把素因子的个数输出。
这样一来的话需要分析一下,对于任何一个整数testnum来讲,它可以被一个不比它大的数m整除,首先判断m必须是素数而且可以整除这个testnum,由此写出程序代码:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int testnum = 0;
bool flag = true;//标志位:m的值符合条件
int num = 0;//每个m的个数
cin >> testnum;
int temp = testnum;
cout << temp << "=";
for (int m = 2; m <= temp; m++){//找到每个满足条件的m值
if (temp%m==0){//判断m是否可以整除testnum
flag = true;
for (int n = 2; n<= int(sqrt(double(m))); n++){//判断m是否为素数
if (m%n == 0){
flag = false;
break;
}
}if (flag){//唯一的情况:m可以整除testnum并且是素数。
num = 0;
while (temp%m == 0){
num++;
temp = temp / m;
}if (temp > 1){
cout << m << "^" << num << "*";
}
else{
cout << m << "^" <<num << endl;
}
}
}
}
return 0;
}
其中考虑了相应的效率问题。
还有其他的算法:算法思想先把在testnum范围内的素数找出来保存在一个数组变量中,把其中的个数也通过数组进行保存,虽然算法写起来比较好写,但是没有考虑效率问题。代码如下:
#include<iostream>
#include<cmath>
#define N 1000
using namespace std;
int main()
{
int a[N], b[N], n, m, p, i, j, k, temp, flag;
while (cin >> n)
{
k = 0;
for (i = 2; i <= n; i++)
{
temp = int(sqrt(double(i)));
flag = 1;
for (j = 2; j <= temp; j++)
{
if (i%j == 0)
{
flag = 0;
break;
}
}
if (flag&&n%i==0)
{
a[k] = i;
k++;
}
}
for (i = 0; i<k; i++)
{
p = 0;
while (n%a[i] == 0){
p++;
n = n / a[i];
}
b[i] = p;
}
cout << n << "=";
for (i = 0; i<k - 1; i++)
cout << a[i] << "^" << b[i] << "*";
cout << a[k - 1] << "^" << b[k - 1] << endl;
}
}
这种方式产生的效果为:
如果想产生120=2*2*2*3*5或者120=5*3*2*2的情况需要改变文中变量的输出顺序以及条件判断方式。
第二种方式中其中n是恒为1:需要一个变量去保存它或者改变输出的方式。
继续。。。。。。