本次写的是分解质因数,里面涉及到合数和质数,百度百科中解释是:质数(prime number)又称素数,有无限个。除了1和它本身以外不再有其他的除数整除(例如31);合数,数学用语,英文名为Composite number,指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数(如12=2*2*3)
代码如下:
/*分解质因数*//*第1版*/
#include<stdio.h>
#include<stdlib.h>
#define N 100
int i = 0;
void diGui(int c ,int * p)
{
int j = 2;
while(c % j != 0 && j < c)
{
j++;
}
if( c == j)
{
*(p+i) = j;
i++;
}else{
*(p+i) = j;
i ++ ;
c = c / j;
diGui(c,p);
}
}
int main()
{
int a = - 1;
printf("请输入一个正整数;\n");
scanf("%d",&a);
int flag = a;
int* p = (int*)calloc(N,sizeof(int));
diGui(a,p);
printf("%d\n",i);
for(int m = 0;m < i;m++)
{
printf("%d\n",*(p+m));
}
int sum = 0;
for(int k = 0; k< i; k++)
sum += *(p+k);
if(0 == sum)
printf(" %d是质数\n",flag );
else
{
printf("%d=",flag);
for(int j = 0;j < i ; j++)
{
if(j != i - 1)
printf("%d*",*(p+j));
else
printf("%d",*(p+j));
}
printf("\n");
}
return 0;
}
改正版:第1版没有区分合数和质数,合数和质数都调用diGui 这个函数,依据diGui函数的特点:存储每一个满足条件:c%j =0的j值,直至j为一个质素时,保存这个质数为止,即递归结束,所以是质数作为参数时,空间也会保存一个数(即这个质数本身),在打印时也会打印,这和实际不符(实际情况:输出xx是质素),此题修改处;增加区分质数和合数的函数,当是质数时,不执行diGui这个函数,只有是合数时才执行diGui这个函数,这样的话,能真正达到要求,
/*分解质因数*//*第2版(完整版)*/
#include<stdio.h>
#include<stdlib.h>
#define N 100
int i = 0;
int isCompositeNumber(int n)//---判断是否是合数(质数即素数)
{
int i = 2;
while(n % 2 != 0 && i < n)
i++;
if( n == i)
return 0;
else
return 1;
}
void diGui(int c ,int * p)
{
int j = 2;
while(c % j != 0 && j < c)//for(int j = 2;c % 2 !=0;j++);
{
j++;
}
if( c == j)
{
*(p+i) = j;
i++;
}else{
*(p+i) = j;
i ++ ;
c = c / j;
diGui(c,p);
}
}
int main()
{
int a = - 1;
printf("请输入一个正整数;\n");
scanf("%d",&a);
int* p = (int*)calloc(N,sizeof(int));
int flag = isCompositeNumber(a);
if(!flag)
{
printf("%d是质数\n",a);
}
else
{
diGui(a,p);
// printf("%d\n",i);//此处是打印一个合数分解成几个质数
// for(int m = 0;m < i;m++)//此处用于打印空间中存储的数
// {
// printf("%d\n",*(p+m));
// }
printf("%d=",a);
for(int j = 0;j < i ; j++)
{
if(j != i - 1)
printf("%d*",*(p+j));
else
printf("%d",*(p+j));
}
printf("\n");
}
free(p);//动态内存分配完,记得释放
return 0;
}