题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
- (1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。
- (2)但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。
- (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
#include<stdio.h>
int main()
{
int n,i;
printf("请输入整数:");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n%i==0)
{
printf("%d",i);
n/=i;
if(n!=1) printf("*");
}
}
printf("\n");
return 0;
}
测试结果显示:
请输入整数:90 90=2*3*3*5
另法:
#include<stdio.h>
int main(void)
{
int n,count = 1,num,i = 2;
printf("请输入整数:");
scanf("%d",&n);
num = n;
while(i < num)
{
if(n%i == 0)
{
if(count == 1)
printf("%d=%d",n,i);
else
printf("*%d",i);
count++;
n = n/i;
}
else
i++;
}
return 0;
}
*递归法:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int digui(int x)
{
int i,n=1;//n为质数的判断值,若n为1则x为质数,n为0则为x为合数
if(x>3)//x小于等于3为素数,直接到printf("%d",x)这一行,否则运行以下内容
for(i=2;i<=sqrt(1.0*x);i++)//判断x是否为素数,让i从2到sqrt(x)的整数与x分别作除
if(x%i==0)//若x能被i整除
{
n=0;//则让n为0
break;//并打破for循环,此时记录的i为x的一个因数,另一个因数为x/i
}
if(n)//判断n的值,若n为真,即n=1,则输出质数x的值
printf("%d",x);
else//否则,即n=0
{
digui(i);//则对因数i递归调用函数本身
printf("*");//输出一个*
digui(x/i);//再对因数x/i递归调用函数本身
}
}
void main()
{
int n;
printf("请输入数字:");
scanf("%d",&n);
printf("质因数分解如下:\n");
digui(n);
putchar('\n');
//system("pause");
}