蓝桥算法训练之素因子去重

素因子去重

问题描述
  给定一个正整数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组的测试
在这里插入图片描述
在这里插入图片描述有什么不懂得地方,欢迎留言,一起进步@__@

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值