C++ 分解质因数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 分解质因数相关的知识,希望对你有一定的参考价值。

试题描述

已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。
输入
只有一行,包含一个正整数n。
输出
输出只有一行,包含一个正整数p,即较大的那个质数。
输入示例
21
输出示例
7
其他说明
对于60%的数据,6 ≤ n ≤ 1000。
对于100%的数据,6 ≤ n ≤ 2*10^9。

#include <iostream>
using namespace std;
int main()

int max=0,j=2;
long long int i;
scanf("%lld",&i);
if (i<=j)

printf("%d",i);

else

for (;j<=i;j++)

if (i%j==0)

cout<<j;
i=i/j;
if(i!=1)
cout<<' ';


if(i!=1)
printf("%d",i);

system("pause");
return 0;


感觉好像连分解质因数都不对~~求高手帮忙!!

分解质因数编程:
#include<iostream>
using namespace std;
main()
int n;
cin>>n;
int i;
int k=0;
for (i=2;i<=n;i++)

if (k==0&&n%i==0)

cout<<"n="<<i;
n/=i;//找到第一个质因数,按格式输出

while(n%i==0)

cout<<\'*\'<<i;
n/=i;
k=1;
//分解到 n不再是i的倍数是为止

system("pause");
参考技术A #include<iostream>
using namespace std;
void main()

int n;
cin >> n;
int i;
int k = 0;
for (i = 2; i <= n; i++)

if (k == 0 && n%i == 0)

cout << n << "=" << i;
n /= i;
k = 1;

while (n%i == 0)

cout <<"*" << i;
n /= i;


system("pause");

第一个回答是错的,这个完全正确,不谢
参考技术B 这个,可以正确运行的。

#include <iostream>
#include <stdio.h>
using namespace std;

int main()

int max=0,j=2;
int i;
scanf("%d",&i);
if (i<=j)

printf("%d\n",i);

else

for (j=2;j<=i/2;j++)

if (i%j==0)

cout<<i/j<<endl;
j=0;
break;


if(j>0)printf("%d\n",i);

//system("pause");
return 0;
追问

忘说了,还要满足:X<=LongLongMax

再帮忙改改,谢了~

本回答被提问者和网友采纳
参考技术C 2012年noip第一题?

#include <iostream>
#include <math.h>
using namespace std;
int main(void)
unsigned n;
cin>>n;
int m=sqrt(n);
for(int i=m;i>=2;i--)
if(n%i==0)

cout<<i<<endl;
return 0;

return 0;


BTW,iostream效率太低,应该直接用C的I/O函数

小开带你学C++ | Lesson 11 函数初步和分解质因数问题

大家好,我是小开,我们的C++系列又回来啦~


上一次我们解决了质数问题,并讲解了函数的初步内容。这一次,让我们来试着用函数把判断质数的代码封装起来。


解决这个问题之前,我们需要了解一种新的类型的变量:bool。


布尔型变量,有别于整型变量,只有真(true)和假(false)两种情况。


定义布尔型变量可以这样定义:


bool a=true;


好了,接下来,我们就可以开始把判断质数的模块封装到函数里去了。


先看代码:


bool judge(int x){ int i=2;    while((i<=sqrt(x))&&(x%i!=0)) i++;    if(n%i==0) return false;    else return true;       }


函数里的代码,和原先的代码,并没有太大区别,但因为它被封装成了一个函数,我们就可以随意的移植它。


那么上次的质数问题就可以变成这样:


#include<cstdio>#include<cstdlib>#include<iostream>#include<cmath> //sqrt等数学运算需要这个头文件 using namespace std;bool judge(int x){ int i=2; while((i<=sqrt(x))&&(x%i!=0)) i++; if(n%i==0) return false; else return true; }int main(){ int n,i=2;  scanf("%d",&n);  //输入要判断的数     if(judge(n)==falsecout<<"合数"<<endl; else cout<<"质数"<<endl; return 0;}


接下来我们来看一下质数问题的拓展。这是一个分解质因数的程序,先上代码:


#include"cstdio"#include"cstdlib"#include"iostream"using namespace std;int main(){  int n,i=2; cin>>n; printf("%d=",n); do { while(n%i==0) { printf("%d",i); n/=i; if(n!=1) printf("*"); } i++; } while(n!=1); cout<<endl; return 0;}


最主要的,其实就是主函数里的do-while循环和里面的循环嵌套:


 do { while(n%i==0) { printf("%d",i); n/=i; if(n!=1) printf("*"); } i++; } while(n!=1);


首先,我们在自己手动分解质因数,一般是先从2开始除,当不再有2的时候,就+1,开始除以3,以此类推。


在这个过程中,其实我们不用考虑除的数是不是质数——如果它是一个合数,那么组成它的质数肯定已经被除掉了,这个合数就不可能是已经被除了几次的原数的约数了。


程序也是类似,只是把它用代码表达出来而已。


do {    while(n%i==0)  //确保能整除 {      printf("%d",i);  //打印出来      n/=i;  //把原数除掉      if(n!=1)  //没除完就继续 printf("*"); }    i++;//下一个数 }  while(n!=1);//只要原数仍然还能除


好啦,今天的课就到这里,我们下次再见~

以上是关于C++ 分解质因数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 分解质因数

经典算法详解(12)分解质因数

小开带你学C++ | Lesson 11 函数初步和分解质因数问题

分解质因数分解质因数是啥意思? 12分解质因数是??

分解质因数

质因数分解