基础编程题之因数分解
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础编程题之因数分解相关的知识,希望对你有一定的参考价值。
题目1
解题思路
首先对于求素数,因数分解这类的题目,搜索范围一般是[2,sqrt(a)]
因为数学中:假设a
合数,并且a == b * c
,其中b
、c
中必定有一个 ≤ sqrt(a)
,不可能出现b
、c
同时大于a
对于这一题,还有一点要注意的是,当我们把a
的所有2因数都分解出来后,2的倍数(4、6、8…)都不可能再分解出来,比如100分解出2 x 2后,无法再分出2的倍数,同样分解出所有3因数后,则无法再分出3的倍数…
因此我们可以:在[2, sqrt(a)]
区间从小到大逐渐试探的时候,碰到一个分解的因数时a,就一直分解a,直到不能再分解a,此时也不可能再分解出a的倍数。
代码
// write your code here cpp
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
int input;
while(cin >> input)
{
printf("%d = ",input);
for(int i=2 ;i<=sqrt(input);i++)
{
while((input % i == 0))
{
if(input/i==1)//最后一个数字,特殊输出
{
break;
}
printf("%d * ",i);
input/=i;
}
}
printf("%d\\n",input);
}
return 0;
}
题目2
解题思路
这个题和上一题基本一致,只不过上一题要写出完整的表示形式,而这一题需要输出不重复的因子的个数,代码中只需要稍微修改一部分。先判断是否是因子,如果是使用while循环处理能被这个因子整除的情况
代码
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
int input;
while(cin >> input)
{
int number=0;
for(int i=2 ;i<=sqrt(input);i++)
{
if(input % i == 0)
number++;
while(input % i == 0)//就像36,不要有重复的因子
input/=i;
}
if(input > 1)//如果不等于1,说明还有一个因子
number++;
cout<<number<<endl;
}
return 0;
}
以上是关于基础编程题之因数分解的主要内容,如果未能解决你的问题,请参考以下文章