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
再帮忙改改,谢了~
#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;
}
函数里的代码,和原先的代码,并没有太大区别,但因为它被封装成了一个函数,我们就可以随意的移植它。
那么上次的质数问题就可以变成这样:
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)==false) cout<<"合数"<<endl;
else cout<<"质数"<<endl;
return 0;
}
接下来我们来看一下质数问题的拓展。这是一个分解质因数的程序,先上代码:
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++ 分解质因数的主要内容,如果未能解决你的问题,请参考以下文章