118

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();

}

猜你喜欢

转载自blog.csdn.net/weixin_44856544/article/details/113184634
118