zoukankan      html  css  js  c++  java
  • 质因数分解

    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 }

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

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

  • 相关阅读:
    OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6735248.html
Copyright © 2011-2022 走看看