当前位置: 首页 > article >正文

蓝桥杯某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个质数,这就导致我们能判断的数字对象事实上是有限制的,一定会有一个比较大或者特殊的数超出我们能判断的范围,之后我会尝试给出不受这种限制的代码,虽然目前我还没有什么很好的头绪。


http://www.kler.cn/a/403451.html

相关文章:

  • 基于 MUSA 的大语言模型推理和服务框架vLLM
  • Vscode写markdown快速插入python代码
  • 本地部署与外部部署有何不同?
  • AI在虚拟展厅的应用有哪些?有何优势?
  • OpenCV 计算图像清晰度
  • 数据库类型介绍
  • 使用Cursor和Claude AI打造你的第一个App
  • c++调用 c# dll 通过 clr (详细避坑)
  • 数据加密使用方法
  • 使用Python编写一个简单的网页爬虫,从网站上抓取标题和正文内容。
  • 是时候谈谈Go的测试了
  • ArcGIS计算水库库容量
  • 曼昆《经济学原理》第八版课后答案及英文版PDF
  • 7.高可用集群架构Keepalived双主热备原理
  • 头歌-本关任务:使用GmSSL命令行,生成SM2私钥并对文件进行签名验证(第二关)。
  • android viewpager2 嵌套 recyclerview 手势冲突
  • FFmpeg源码:mid_pred函数分析
  • Chromium Mojo(IPC)进程通信演示 c++(2)
  • 实验室管理技术革新:Spring Boot系统
  • 什么是事务,事务有什么特性?
  • 大语言模型的多头切片技术在分布式机器上的运行,每个机器是否需加载完整模型参数?无需加载完整模型参数
  • TAIS 软件管理系统深入分析
  • 工作学习--Arrays.asList的问题
  • Linux相关概念和易错知识点(21)(软硬链接、动静态库)
  • 丹摩智算(damodel)部署stable diffusion心得
  • js中的=、==与===的区别