7-11 素因子分解(20 分)
给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1⋅p2k2⋯pmkm。
输入格式:
输入long int范围内的正整数 N。
输出格式:
按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km
,其中pi
为素因子并要求由小到大输出,指数ki
为pi
的个数;当ki
为1即因子pi
只有一个时不输出ki
。
输入样例:
1323
输出样例:
1323=3^3*7^2
#include<iostream> #include<string> #include<cmath> #include<vector> using namespace std; int main() { vector<int>P; int A[10000] = { 0 }; for (int i = 2; i < 100; i++) { if (A[i] == 0) { for (int j = i * i; j < 10000; j += i) A[j] = 1; } } long n; cin >> n; cout << n << "="; while (1) { long t = n; for (int k = 2; k <= sqrt(n); k++) { if (A[k] == 0 && n%k == 0) { P.push_back(k); n = n / k; break; } } if (n == t) { P.push_back(n); break; } } int sum = 1; for (int q = 0; q < P.size()-1; q++) { if (P[q] == P[q + 1]) sum++; else { if (sum == 1) cout << P[q] << "*"; else { cout << P[q] << "^" << sum << "*"; sum = 1; } } } if (sum == 1) cout << P[P.size() - 1] ; else cout << P[P.size() - 1] << "^" << sum; return 0; }
算法分析:
(1)先用素数筛找到前10000项的素数当除数用
(2)用一个无限循环寻找素因子,当n本身不发生变化时退出循环,即n为1或者没有素因子
(3)将之前得到的素因子存入一个数组中,遇到前后不同的输出,否则sum++,sum为系数的指数,1的时候不用输出