1059. Prime Factors
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1^k1 * p2^k2 *…*pm^km.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range of long int.
Output Specification:
Factor N in the format N = p1^k1 * p2^k2 *…*pm^km, where pi's are prime factors of N in increasing order, and the exponent ki is the number of pi -- hence when there is only one pi, ki is 1 and must NOT be printed out.
Sample Input:97532468
Sample Output:
97532468=2^2*11*17*101*1291
题目大意:给一个整数,将其分解成素数因子,并按要求输出。
主要思想:思路是很直接的,先写一个判断是否为素数的方法,获取输入后判断:如果该数为1,则结果也为1,结束;若该数本身就为素数,则同样无需分解直接输出(这一步很重要,不然如果是个很大的素数就肯定超时了,因为这样从2至这个大数之间的每一个数都需要判断是否为素数,耗时很大)。
接下来,在循环中判断当前素数是否为该数因子,如果是因子,则用数num除以因子将其分解,并按要求输出。注意,在每次成功分解后都需要判断此时的数是否为素数,如果是则直接结束(理由和上面相同,如果给出的数是一个小质数与一个很大的质数相乘,仍会陷入超时的危机);如果该素数不是因子,则找到下一个素数,重复上述操作。直到被分解剩余的部分已经小于当前素数的时候,循环结束。
#include <iostream> #include <math.h> using namespace std; bool is_prime(int x); int main(void) { int num; int i = 2; bool first = true; cin >> num; cout << num << "="; if (num == 1) { //输入为1时,输出 1=1 cout << 1 << endl; return 0; } if (is_prime(num)) { //输入素数时,直接输出无需分解 cout << num << endl; return 0; } while (num >= i) { int count = 0; while (num % i == 0) { num /= i; //num值越来越小 count++; //当前质数因子的数量 } if (count > 0) { if (!first) cout << "*"; //第一次输出不需要*号 if (count == 1) cout << i; else cout << i << "^" << count; first = false; //在每次分解后都需要判断此时的数是否为质数,如果是则直接结束 if (is_prime(num)) { cout << "*" << num << endl; return 0; } } else { while (!is_prime(++i)) //寻找下一个素数因子 continue; } } cout << endl; return 0; } bool is_prime(int x) { if (x < 2) return false; for (int i = 2; i <= sqrt(x); i++) { if (x % i == 0) return false; } return true; }