问题描述:
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
解析:
比较简单,利用递归或者循环可以解决。
循环的话,在for循环里面实现即可;递归,每次找出质因数一个,然后改变n值,再次调用即可。
此处提出一个问题:递归调用返回的是上层还是最终层?
代码:
方法1:
下面是用循环解决的。但需要注意,这里使用while循环可以解决,使用for就不行了。
因为当输出一个因子时,循环的i又要归到0去重新开始,但是for里面的i是不能够改变值的,因为迭代器里的值不允许被改变,只能被引用。所以此处用了while循环。
from sys import stdout
def ReduceNum(n):
i=2
while i<n+1:
if n%i==0:
if i==n:
print(i)
return
else:
stdout.write('%d*' % i)
n=n/i
i=2
else:
i+=1
stdout.write('90=')
ReduceNum(90)
方法2:
开心,终于用方法2解决了出来。
这里重点就是递归和调用,到新的数字是进行下一层,进行新的重新找因子。重点是如何去结束多层的递归,return只是返回上层,而exit()可以强制结束整个程序,从而跳出递归。
# n=int(input())
def ReduceNum(n):
# print('n=%d' % n)
i=2
while i<n+1:
if n%i==0:
# print('i=%d' % i)
if i==n:
print(i)
exit()
else:
print('%d*' % i)
ReduceNum(n/i)
else:
i+=1
print('90=')
ReduceNum(90)
同时附上法2的C++代码,同样使用stdlib.h库中的exit(0)函数:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
void redecenum(int n)
{
for(int i=2;i<n+1;i++)
{
if(n%i==0)
{
if(i==n)
{
cout<<i;
exit(0);
}
else
cout<<i<<"*";
redecenum(n/i);
}
}
}
int main()
{
redecenum(90);
return 0;
}