质因数分解
- 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 Input756
样例输出 Sample Output756=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 }