质因数分解

1.noi 43 质因数分解 总时间限制: 
1000ms
内存限制: 
65536kB
描述

已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。

输入
输入只有一行,包含一个正整数 n。

对于60%的数据,6 ≤ n ≤ 1000。
对于100%的数据,6 ≤ n ≤ 2*10^9。
输出
输出只有一行,包含一个正整数 p,即较大的那个质数。
样例输入
21
样例输出
7
  • 唯一分解定理:

根据唯一分解定理,若此题有答案,则输入数据满足有且只有一组质数相乘=n

所以,i从2循环到根号n,如果n%i==0,则n/i为答案

也就是说,n=质数a*质数b,n没有其他的分解

  • 证明:

假设还有另外一组分解c*d

那么c*d分解质因数的结果与a*b相同

又因为a、b是质数

所以a*b分解质因数=a*b

所以c=a,d=b

即只有一种分解

  • 代码:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 int n;
 9 
10 bool pd(int x)
11 {
12     if(x%2==0) return 1;
13     int j=3;
14     int t=sqrt(x);
15     while(j<=t&&x%j!=0) j+=2;
16     if(x%j==0) return 0;
17     else return 1;
18 } 
19 
20 int main()
21 {
22     scanf("%d",&n);
23     int t=sqrt(n);//i最大的范围 
24     for(int i=2;i<=t;i++)//因为1不是质数,所以循环从2开始进行 
25     {
26         if(n%i==0)//如果找到了能够进行整除的i     
27         {//又因为样例说一定满足n 是两个不同的质数的乘积,所以直接输出另外一个数就行
28             //if(pd(i))//所以由上得:不需要判断第一个数是否能够被模 ,即满足唯一分解定理 
29             {
30                 printf("%d",n/i);
31                 return 0;                
32             }
33         }
34     }
35     return 0;
36 }

 2.codevs 1792 分解质因数

题目描述  Description

编写一个把整数N分解为质因数乘积的程序。

输入描述  Input Description

输入一个整数 N

输出描述  Output Description

输出 分解质因数 。拆成几个质数相乘的形式,质数必须从小到大相乘

样例输入  Sample Input

756

样例输出  Sample Output

756=2*2*3*3*3*7

数据范围及提示  Data Size & Hint

范围在longint内。不是高精度。

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int main() 
 8 {
 9     int n,j=2,n2;
10     cin>>n;
11     n2=n;
12     cout<<n<<"=";
13     while(j*j<=n) 
14     {//外部循环
15         while(n%j==0) 
16         {///内部循环
17             if(n/j!=1)
18             cout<<j<<'*';
19             else//这里需要加一步判断,防止多输出“*”号 
20             {
21                 cout<<j;
22                 //return 0;
23 /*可以不加return 0;因为此时n为1,则接下来的是n>1才进行输出n*/ 
24             }
25             n/=j;
26         }
27         ++j;
28     }
29     if(n>1)
30         cout<<n;
31     return 0;
32 }

 

转载于:https://www.cnblogs.com/zxqxwnngztxx/p/6735248.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值