• 质因数分解


    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 }

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    p1373
    考试总结 2018-5-6
    p1044与p1898
    p1905
    p1904 p1903
    p1177
    p1273  日常打表
    p1142
    并查集与并查集模板
    p1265
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6735248.html
Copyright © 2020-2023  润新知