蓝桥杯 素因子去重 C

问题描述  
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式 
  一个整数,表示n
输出格式  
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定  n<=10^12
样例解释:n=1000=2^353,p=2*5=10

解析;
  质因数的分解时候很简单的了,我们三化五除二的就可以把一个数分的透透,O(∩_∩)O哈哈~。难点就是如题目表示的“去重”,怎样可以避免将同一个质因子重复想乘的问题。我的程序的思路是从2开始除,不回头,每当碰到一个可以被整除的数,就对他进行判断,是否前面已经有这个质因子了.最简单的检验就是用这个数把他前面的所有数都除一遍,若能够将前面的一个数整除,那么n肯定也能将这个数整除,而且人家还在他前面,所以此时这个数就要舍弃了,不能给p乘。但是这种方法很耗时间。所以可以改进一下,就是用这个数数和他前面的数的平方相比较,这样就可以节省时间了。

这边插个图对比一下,两种方法耗时的差距
上面一个就是用第一种,下面是改进后的耗时,可以看出,时间的差距还是挺大的在这里插入图片描述

#include <stdio.h>
int Lnode(long long n){
 long long i;
 for(i=2;i*i<=n;i++)
      if(n%i==0)
       return 0;
       return 1;
}
int main(){
 long long n,p=1,i;
 
 scanf("%lld",&n);
 for(i=2;i<=n;i++){
  if(n%i==0&&Lnode(i)){
   p=p*i; 
   n=n/i;
   
  }
 }
 printf("%lld",p);
 return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值