118: date:2021.1.26
要点: 通过for()循环遍历控制可能的因数集;
第一个if()判断因数是否能被整除;
第二个if()0判断n和因数是否是素数;
详细代码如下:
#include<stdio.h>
#include<math.h>
int prime(int m) //是素数则返回1,否则返回0
{
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)
{
/* 注释:
从能作为m的因子的这些数中筛选出符合条件的
how:怎么查找一个数的因子?
把当前数n除以2,看能否整除,如果不能整除,再除以3,看看能否整除,一直除到根号n为止
能整除则说明它是其中的一个因子,则另一个是n/k;
*/
int k,flag=0;
for(k=2; k <= (int)sqrt((double)n); k++) //for循环用来控制,从所有的2——根号n下寻找因子k
{
if(n % k != 0) //判读n能否整除k
{
continue;
}
if(prime(k) == 0||prime(n/k) == 0) //判读k、n/k是否是素数
{
continue;
}
flag = 1;
*x = k; //因为 k < 根号n, 所以 n/k >= 根号n,所以 n/k >= k;
*y = n/k;
break;
}
/* error:
if(prime(n/k) == 1 && prime(k) == 1)
flag = 1;
if(*x < *y)
{
*x = n/k;
*y = k;
}
*/
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();
}