C/C++_2019_8_5(分解因数 )

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44770155/article/details/100586735

如果人仅仅为自己劳动,也许他能称为著名的学者,伟大的智者,
卓越的诗人,但是他永远也不能成为真正完善和真正伟大的人。——马克思

题目描述

分解因数 | 时间限制:1秒 | 内存限制:32768K
所谓因子分解,就是把给定的正整数a,分解成若干个素数的乘积,即a = a1 × a2 × a3 × … × an, 并且 1 < a1≤ a2 ≤ a3 ≤ … ≤ an。其中a1、a2、…、an均为素数。 先给出一个整数a,请输出分解后的因子。

输入描述

输入包含多组数据,每组数据包含一个正整数a(2≤a≤1000000)。

输出描述

对应每组数据,以“a = a1 * a2 * a3…”的形式输出因式分解后的结果。

示例

输入
10
18
输出
10 = 2 * 5
18 = 2 * 3 * 3

题目解析

注:题目中没有说明的是:如果出现了质数,需要打印成13 = 13的形式。
90 = 2 * 3 * 3 * 5。

解题思路

看到短除法后,我们很清楚的知道,要想求出它的每一个质因数,我们需要用质数去试除。90能被2整除,那就拿商继续除以2,除不尽就换3,一直到除到质数为止。基础代码框架类似判断质数,只是被判断的数字在过程中不断被除,最终循环结束的时候,那个被处理过的数字,就是最后一个质因数。以下代码注释以90为例。

示例代码

#include <cstdio>
#include <cmath>
#include <iostream>
int main()
{
	unsigned int n;
	while (std::cin >> n)
	{
		printf("%d =", n); //输出90 =
		for (unsigned i = 2; i <= std::sqrt(n); i++)
		{
			//反复除同一个数,直到除不尽,排除刚好是该数的n次方的情况
			while (n % i == 0 && n != i) 
			{
				printf(" %u *", i); //第一次打印 2 *,第二次打印两个 3 *
				n /= i; //能整除就修改n的值
			}
		}
		//跳出后,n已经是处理过的一个质数,就是最后一个质因数:5
		printf(" %d\n", n); 
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44770155/article/details/100586735