蓝桥杯某C语言算法题解决方案(质因数分解)
蓝桥杯原题:将一个正整数分解质因数例如:输入90,打印出90 = 2 * 3 * 3 * 5。
声明:该题目是否为蓝桥杯原题未知,我是从CSDN上面查到的,仅对该题目进行解决。
这个题与我之前发表过的一些关于检验一个数字是否为素数(质数)的项目相关性极大,如果我们要对一个数字进行质因数分解,首先我们要直到它可能会有哪些质因数。我们必须意识到,如果一个数字是它的因数,那么这个数字一定小于它。因此,它的质因数也一定会小于它。
这就给了我们突破口,首先我们要找到一些“候选素数(Candidates)”,也就是只要这些数字是素数,并且比我们需要检验的数字小,那么它们就有可能是它的质因数,也就是我们所属的候选素数。
单单找到这些素数还不行,我们还需要把他们存储起来以备后面检验它们是否是“真质因数(True prime factors)”。
我必须提示大家,我这次写的项目并非最简单的方法,事实上,我们可以不用数组保存这些候选素数,而是直接在每个素数被找到之后立刻进行判断并且输出,这样会更简单一些。但是我这次不会给你展示这种方法,我展示的是使用了数组的方法,之后我会给出我提到的这个更好的方案,然而这次,我们要解释这个比较容易理解的方案。
下面我们展示完整的代码:
//从2开始第500个素数是3571,因此本程序的arr_store最大储存3571,因此是有数据限制的。
// 基于以上原因,请不要尝试过大的数字。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void judPrime(int put,int arr[],int* y) {
int a = put - 1; int trial = 0;
for (a = put - 1; a > 0; a--) {
if ((put % a == 0)&&(a!=1)) {
trial++;
}
else if (a == 1) {
}
}
if (trial == 0) {
arr[*y] = put;
*y=*y+1;
}
}
int main()
{
int input = 0; int judge = 0;
int x = 2; int arr_store[500] = { 0 };
int y = 0; int* py = &y;
printf("请输入你要质数分解的数字:");
scanf("%d", &input);
for (x = 2; x < input; x++) {
if (input % x == 0) {
judge++;
}
}
x = 2;
if (judge == 0) {
printf("输入的数字是素数,其质因数分解结果为:%d*1", input);
}
else {
for (x = 2; x < input; x++) {
judPrime(x, arr_store,py);
}
x = 0;
while (arr_store[x] != 0) {
if (input % arr_store[x] == 0) {
printf("%d*", arr_store[x]);
input /= arr_store[x];
x++;
}
else {
x++;
}
}
printf("%d", input);
}
return 0;
}
由于我对数组arr_store的大小规定为500,因此我们最多能存下第500个质数,这就导致我们能判断的数字对象事实上是有限制的,一定会有一个比较大或者特殊的数超出我们能判断的范围,之后我会尝试给出不受这种限制的代码,虽然目前我还没有什么很好的头绪。