问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=2^3*5^3,p=2*5=10
解题思路
在忽略数据规模的情况下,我的想法是先求出n的所有素因子,然后将素因子相乘。在考虑数据规模的情况下,我们需要考虑1e12这个数据规模,我曾经想过使用数组存放素因子,但是在这个大规模下,机器内存占用太大,无法通过测试用例。百思不得其解的时候,我在网上看到了一位大佬给出的该题解法,他的思路也是求出n的所有素因子,然后将素因子相乘,区别是每当求出素因子后,大佬的做法是先用n除去素因子,得到一个去除已知素因子倍数后的数,降低n,循环寻址下一个素因子,直到结束。
向大佬致敬。
下面贴出我的第一版实现和最后一版实现,中间有好几版,但不具有代表性,故不记录。
代码实现-第一版
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int isPrime(int number);
int main(int argc, char *argv[]) {
int number = 0, i;
int sum = 1;
scanf("%d", &number);
for (i = 2; i < number; i++) {
if ( number % i ==0 && isPrime(i)) {
sum *= i;
}
}
printf("%d\n", sum);
return 0;
}
int isPrime(int number) {
int i;
for (i = 2; i <= sqrt(number); i++) {
if (number % i == 0) {
return 0;
}
}
return 1;
}
代码实现-最终版
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
long long number, sum = 1, i;
scanf("%lld", &number);
for (i = 2; i <= number; i++) {
if ( number % i ==0) {
sum *= i;
while( number % i == 0 ) {
number /= i;
}
}
}
printf("%lld\n", sum);
return 0;
}