首页 > 试题广场 >

以下prim函数的功能是分解质因数。括号内的内容应该为?

[单选题]
以下prim函数的功能是分解质因数。括号内的内容应该为?
void prim(int m, int n)
 {
     if (m >= n)
     {
         while (        ) n++;
         (     );
         prim(m, n);
         cout << n << endl;
     }
 }

  • m/n   m/=n
  • m/n   m%=n
  • m%n m%=n
  • m%n m/=n
推荐
n从2开始
第一处为m%n,代表取余。当余数是0的时候表示除尽,跳出while循环,即找出一个质因数。此时一个质因数即为n
然后 m/=n 即让m除去这个质因数,然后再进入求新m质因数的递归。


举例:m=6,n=2

m>n;
m%n=0,跳出while,n没有加1。此时m=6,n=2
m/=n,此时m=3,n=2   (2为一个质因数)
    递归prim(m, n),即prim(3, 2);
     m>n;
    m%n=1,n++,此时m=3,n=3,继续while循环
    m%n=0,跳出while循环,此时 m=3,n=3  (3为另一个质因数)
    m/=n,此时m=1,n=3
        递归 prim(m, n),即 prim(1, 3);
       不满足条件(m > n),返回上层
   输出质因数 n=3
输出质因数 n = 2  
    


编辑于 2016-08-07 13:55:27 回复(11)
n初始取2即可
发表于 2015-03-24 17:56:49 回复(1)
题目需要加个前提条件,n只能输入2。
因为prim()的递归里,n逐渐增大,每次都把大于当前的n传给下一个prim(),
如果n不是2,假设为3,那么会错过2这个因数(如果有2这个因数)
发表于 2018-09-29 17:00:46 回复(0)
#include <iostream>
using namespace std;

void prime(int m,int n)
{
	if(m>n)
	{
		while(m%n!=0) n++;
		m=m/n;	
		prime(m,n);
		cout<<n<<endl;
	}
}

int main()
{
	prime(15,2);//n从2开始,结果为5,3
	return 0;
}

发表于 2015-11-01 16:01:51 回复(0)
分解质因数是将一个数差分成为几个质数相乘,首先找到一个n可以被m整除,整除就是余数为零才能跳出循环,而如果只是做除法 只有当m<n的时候才会出现等于0.这与if的条件判断相互冲突。
发表于 2015-03-12 21:44:30 回复(0)
while(        ) n++; 
从这一行可以看出,n是不断+1的。由此想到,分解质因数就是从2开始不断试着(质数)看能否被整除。
能整除,余数才为零。所以括号里是,m%n。
下一个括号,m/=n。正是分解了第一个质因数n,得出的商,再以商作为被除数,继续分解。

发表于 2016-10-09 20:53:49 回复(0)
这就是一个有bug的程序,#include <iostream>
using namespace std;
 
void prime(int m,int n)
{
    if(m>1)
    {
        while(m%n!=0) n++;
        m=m/n; 
        prime(m,n);
        cout<<n<<endl;
    }
}
 
int main()
{
    prime(4,2);/
    return 0;
}
这个才对!
发表于 2016-04-12 11:23:57 回复(7)
发表于 2017-10-01 14:44:06 回复(3)
这样看就明白了,首先我们将递归的代码去掉,表示找出一个满足条件的质因数,此时是对m分解质因数
void prim(int m, int n)
{
    if(m >= n)
    {
        while (m % n) n++;
        cout << n << endl;
    }
}
根据笔算过程,下一次是对m/n分解质因数,此时质因数最小的应是从上一次的n开始,所以就有了下面的代码
void prim(int m, int n)
{
    if(m >= n)
    {
        while (m % n) n++;
        cout << n << endl;
        prim(m / n, n);
    }
}
上面的输出质因数是从小到大的顺序,如果要反过来,可以这样写
void prim(int m, int n)
{
    if(m >= n)
    {
        while (m % n) n++;
        prim(m / n, n);
        cout << n << endl;
    }
}
题目中输出的就是从大到小的顺序
发表于 2018-07-20 14:08:01 回复(1)
prim函数更精确的描述应该为:分解质因数,输出所有大于 n 的质因数
发表于 2019-08-02 17:43:04 回复(0)
递归就行了,1、一个数,如果只有1和它本身两个约数,这样的数叫做质数(或素数)。如7和11都是质数。  2、一个数,如果除了1和它本身还有别的约数,这样的数叫做合数,如:9和12都是合数。  3、分解质因数:把一个合数用质因数相乘的形式表示出来。如:30=2×3×5,24=2×2×2×3。 4、分解质因数时,通常用短除法。短除法是除法的简化。如: 
编辑于 2017-06-25 22:35:23 回复(0)
1、一个数,如果只有1和它本身两个约数,这样的数叫做质数(或素数)。如7和11都是质数。 
2、一个数,如果除了1和它本身还有别的约数,这样的数叫做合数,如:9和12都是合数。 
3、分解质因数:把一个合数用质因数相乘的形式表示出来。如:30=2×3×5,24=2×2×2×3。
4、分解质因数时,通常用短除法。短除法是除法的简化。如:
发表于 2016-08-26 21:15:54 回复(0)
质因数分解是将原数分解成几个质数相乘. 
发表于 2016-05-19 08:36:21 回复(0)
#include<stdio.h>
void main()
{
 int n = 2,M,m ;
 printf("请输入一个合数:");
 scanf("%d", &m);
 M =m;
 while(m >=n)
 {
  
  while (m%n != 0)
  {
   n++;
  }
  m = m / n;
  printf("%d的质数有:%d\n",M, n);
 }
}

发表于 2017-08-20 01:09:50 回复(0)
#include <iostream>
#include <cstring>
 
using namespace std;
void prim(int m, int n)
 {
     if (m >= n)
     {
         while (m%n) n++;
         m/=n;
         prim(m, n);
         cout << n << endl;
     }
 }

 
int main()
{
   prim(50,2);
   return 0;
}
5
5
2
发表于 2021-03-05 16:37:25 回复(0)
这题没有问题吗?n没有初值,难道要用户输入?
发表于 2020-07-11 22:39:15 回复(0)

程序中这两句要不要调下位置呢,感觉只会输出一个因数。
prim(m, n);
cout << n << endl;

发表于 2022-02-13 23:13:11 回复(0)
首先m>n,那么m/n>1恒成立,也就是说while无线循环,结合题意,这是不可能的。排除AB
那么C,D中来分析。
m%n==0时跳出循环,即代表n是m的一个因数,那么之后m=m/n是另一个因数,再去找之后的m的因数

发表于 2021-06-28 16:53:23 回复(0)
做这道题首先需要明白分解质因数是干嘛的,需求都不明白,看代码一头雾水。。。
发表于 2021-05-23 20:06:32 回复(0)
n一定要等于2? 搞蒙了,我还以为求公因数呢
发表于 2020-12-15 14:37:52 回复(0)

#include <iostream>
using namespace std;
void func(int m, int n)
{
    if(m >= n)
    {
        while(m%n)
            n++;
        m /= n;
        if(m < n)
            cout << m << endl;
        func(m, n);  
        cout << n << endl;
    } 
}

int main()
{
    func(120,2);
    system("pause");
}
发表于 2020-09-25 22:29:34 回复(0)