素因子去重
问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=2^353,p=2*5=10
思路分析:
依题可知,要把n分解成几个数相乘并且是素数,出现的次数最多为1次,如果出现多次,就把多余的去掉,然后把这些素因子相乘即可得到结果p.我们要注意n是小于等于10^12(大于2的32次方),已经超过了int 类型的范围,所以要用__int64来定义变量
C语言实现:
#include<stdio.h>
int main()
{
__int64 n,i,p=1;
int j,k,flag;//flag是一个标志,表示n是否能被整除,0代表不能 被整除,1代表能被整除
__int64 a[50]={0};//用来放求得的因数
j=0;
flag=0;//初始化为0,表示不能被整除
scanf("%I64d",&n);//注意64位的输入格式为:%I64d
i=2;
while(i<=sqrt(n))//i是否小于根号n
{
if(n%i==0)//n能被i整除
{
a[j]=i;//因为n能被i整除,i是n的一个因数
n=n/i;//为下一次循环做准备
j++;
flag=1;//修改flag的值为1,表示n被整除了
}
i++;
if(flag)
{
i=2;//flag为1,n要重新从i=2求余
flag=0;
}
}
//下面是去重,把相同的留下一个,其他的设为0
for(i=0;i<j-1;i++)
{
for(k=i+1;k<j;k++)
if(a[i]==a[k])
a[k]=0;
}
//计算p的结果,把不等于0的元素相乘
for(i=0;i<j;i++)
if(a[i]!=0)
p=p*a[i];
printf("%I64d",p); //注意:打印输出格式为:%I64d
return 0;
}
以下是测试的数据:533 533
6021 669
1911 273
770518 770518
887244 443622
79561585 79561585
80189196 40094598
81095240 20273810
1822020238 1822020238
18374001125 734960045
一开始忘记了n的范围,用的是int类型,前9组数据通过了,但第10组没过之后把int改成__int64就通过10组的测试
有什么不懂得地方,欢迎留言,一起进步@__@