要求
请编写函数fun,其功能是:验证参数n是否可以分解成2个素数相乘,是则返回1,否则返回0,并通过指针变更x、y返回分解后的2个素数值,要求*x<*y。主程序中将打印出分解结果。
例如:111=3*37,当函数fun的参数n为111时
可以分解为2个素数(3和37)的乘积函数返回值为1。
另外,prime函 数验证参数m是否为素数,是则返回1,否则返回0.
解题思路
本程序是判断一个整数是否能分解成两个素数,我们思路是先分解成两个数k和k2,由于存在省略小数的若正确分解,则判断是否满足题意。满足题意,则将函可能,所以需要判断这两个数是否能分解,k*k2==n。数返回值改变,将这两个数传回,然后退出do循环:若不满足题意则k+=1,重新分解成新的两数再次判断,当分解出的数不满足题意*x<*y要求,则结束。
代码
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
int fun(int n,int *x,int *y)
{
int k,flag=0;
int k2=0;
k=2;
do
{
k2=n/k;
if(k*k2==n)
{
if(prime(k) && prime(k2) && k<k2)
{
flag=1;
*x=k;
*y=k2;
break;
}
}
k++;
}while(k<k2);
return flag;
}
main()
{
int a,b;FILE *out ;
out = fopen("out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
if(fun(11111,&a,&b)) {
printf("11111=%d*%d\n",a,b);
fprintf(out, "11111=%d*%d\n",a,b);
}
if(fun(1111111,&a,&b)) {
printf("1111111=%d*%d\n",a,b);
fprintf(out,"1111111=%d*%d\n",a,b);
}
fclose(out);
getchar();
}