原题链接:https://www.nowcoder.com/practice/20426b85f7fc4ba8b0844cc04807fbd9?tpId=40&tqId=21338&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
const ll N = 1e6 + 10;
const ll MAXN = 1e6+10;
bool mark[N];
int prime[N];
int primeSize = 0;
//素数筛
void Prime()
{
//特别注意一定要是long long,否则数会一出
for(ll i=2; i <= N; i++)
{
if(mark[i] == true) continue;
prime[primeSize++] = i;
// cout << prime[primeSize-1] << endl;
if(i >= 1000) continue;
for(ll j = i * i; j <= N; j += i)
{
mark[j] = true;
}
}
}
int main()
{
Prime();
int n;
while(cin >> n)
{
int ansPrime[30];//按顺序保存分解出来的素因数
int ansSize = 0;//分解出素因数的个数
int ansNum[30];//初始化幂指数为0
for(int i = 0; i < primeSize; i++)
{
if(n % prime[i] == 0)
{
ansPrime[ansSize] = prime[i];
ansNum[ansSize] = 0;
while(n % prime[i] == 0)
{
ansNum[ansSize]++;
n = n / prime[i];
}
ansSize++;
if(n == 1) break;//若分解为1,则分解提前终止
}
}
//若测试完2到1000000内的所有素因数,n仍未被分解至1,则剩余的因数一定是大于1000000的素因数
if(n != 1)
{
ansPrime[ansSize] = n;
ansNum[ansSize++] = 1;//不要忘记ansSize+1
}
int ans = 0;
for(int i = 0; i < ansSize; i++)
{
ans += ansNum[i];
}
cout << ans << endl;
}
}
不要忘记数默认是int,所以两个int相乘就可能会溢出。