首先这两个部分的区别,我最先理解的不同是质因数是由一个数分解为两个没有其他共同质因子的正整数。
这个是正式的定义正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。
然后最大公因数和最小公倍数是两个数找出他们的这两个值。
然后首先写一下最大公因数和最小公倍数的方法吧
首先求最小公倍数首先要先求出最大公因数,最大公倍数可以由这个算式来计算,原理自己想一下也很快可以理解
A数/最大公因数*B数/最大公因数
那么要解决的问题就是求这两个数的最大公因数
那么有一个算法:辗转相除法(欧几里算法)
方法就是a,b,c(a>b)
c=a%b;
a=b;
b=a%b;
if(b==0)则a就是最大公因数,否则一直继续上面的步骤。
下面我将写出完整的代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a,b;
int main()
{
int c;
cin>>a>>b;
int maxm,minm;
maxm=max(a,b);
minm=min(a,b);
while(minm)
{
c=maxm%minm;
maxm=minm;
minm=c;
}
cout<<maxm;
return 0;
}
(自己写的代码可能不尽优化奥,亮剑)
然后再是质因数分解
这个主要就是遍历下去
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int isprime(int n)
{
int flag = 1;
int i = 0;
for (i = 2; i <= sqrt(n); i++)//别忘了sqrt要引头文件math.h
{
if (n % i == 0)
{
flag = 0;
break;
}
}
return flag;
}
int main()
{
//1、用min和max变量确定你要求质因数的数的范围
//比如输入3 10 就会帮助你求3-10这每个数所能分解的质因数
int min = 0;
int max = 0;
int i = 0;
int j = 0;
printf("请输入你想获得质因数的数的范围\n");
scanf("%d %d", &min, &max);
//2、写一个判断是否为素数的函数isprime()
//如果是素数直接写出该素数=该素数
//如果判断为合数,就要用合数分解质因数的方法。
for (i = min; i <= max; i++)
{
if (isprime(i))
{//为真则为质数,直接输出
printf("%d=%d\n", i, i);
}
else
{
//既然进了else就说明是合数了
int tmp = i;//tmp为临时保存i的值,防止i在后面的操作中被改变
printf("%d=", tmp);
for (j = 2; j < tmp; j++)
{//这里j从二开始,因为我此时分解合数,最小的质数是2,所以从2开始
//还应注意的是必须是j<tmp,如果多一个=,那还分解什么合数,直接等于本身*1了
if (isprime(j))
{//判断是否为质数,因为分解质因数的前提是因子必须为质数的前提下
while (tmp % j == 0)
{
printf("%d*", j);
tmp /= j;
if (isprime(tmp))
{//一直除以质因子,直到有一次除出来结果是质数,说明分解质因数完毕
printf("%d", tmp);
break;
}
}
}
}
printf("\n");
}
}
return 0;
}
后面我还想写一个就是分解一个数的所有质因数的组合。
我现在实在是没有耐心了,我下次一定会发一个自己的,这次先从copy一下别人的吧
为了避免学术不端,我现在要at一下博主,算了我不会就这样吧,大家可以去看看这位大大的解析奥,非常的好