C语言实现将任意一个实数拆分为三个质数

本文探讨了使用C语言和素数筛算法来解决将任意实数分解为三个质数的方法,旨在优化计算效率,缩短运行时间。
摘要由CSDN通过智能技术生成

关于如何解决将任意一个实数拆分为三个质数的问题,需要用到素数筛的知识,尽量减少不必要的计算,降低所需时间。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
unsigned int sum;
int main()
{
	system("color F0");
	void f1(unsigned int all_input);
	unsigned int all_input;		clock_t start, end;
	while (1)
	{
		printf("请输入要计算的值:"); sum = 0;
		scanf_s("%u", &all_input);
		start = clock();
		if (all_input < 3)
			printf("输入数值不能小于3;\n");
		else
		{
			switch (all_input)
			{
			case 3:printf("3可以由素数1、1和1组成;\n\n共有1种情况\n\n"); break;
			case 4:printf("4可以由素数1、1和2组成;\n\n共有1种情况\n\n"); break;
			case 5:printf("5可以由素数1、2和2组成;\n"
				      "5可以由素数1、1和3组成;\n\n共有2种情况\n\n"); break;
			case 6:printf("6可以由素数1、2和3组成;\n"
				      "6可以由素数2、2和2组成;\n\n共有2种情况\n\n"); break;
			case 7:printf("7可以由素数1、1和5组成;\n"
				      "7可以由素数1、3和3组成;\n"
				      "7可以由素数2、2和3组成\n\n共有3种情况\n\n");break;
			case 8:printf("8可以由素数1、2和5组成;\n"
				      "8可以由素数2、3和3组成;\n\n共有2种情况\n\n"); break;
			default:f1(all_input); printf("\n共有%u种情况\n\n",sum);
			}
		}	
		end = clock();
		printf("time=%f\n\n", (double)((double)end - (double)start)/CLK_TCK);
	}
	return 0;
}
void f1(unsigned int all_input)
{
	void g(unsigned int partA,unsigned int all_input);//负责传送,可能被取消
	unsigned int partA,k,d,r;
	k = all_input / 3;
	if (k <= 4)
	{
		for (partA = 1; partA <= 3; partA++)
		{
			g(partA, all_input);
		}
	}
	else
	{
		for (partA = 1; partA <= 3; partA++)
		{
			g(partA, all_input);
		}
		for (partA = 5; partA <= k; partA = partA + 2)//避免大于2的偶数进入
		{
			r = (unsigned int)sqrt(partA);
				for (d = 3; d <= r; d = d + 2)
				{
					if (partA % d == 0)
						d = k+1;
				}
			if(d != k + 3)
			g(partA, all_input);
		}
	}	
}
void g(unsigned int partA, unsigned int all_input)
{
	unsigned int partB, partC, partD, partE, r,d;
	partB = all_input - partA;
	if (partB % 2 != 0)
	{
		if ((partA == 1) || (partA == 2))
		{
			partC = partB - 2;
			if (partC % 2 != 0)
			{
			r = (unsigned int)sqrt(partC);
				for (d = 3; d <= r; d = d + 2)
				{
					if (partC % d == 0)
						d = partC + 1;
				}
				if (d != partC + 3)
				{
					printf("%u由素数%u、2和%u组成;\n", all_input, partA, partC);
					sum++;
				}
			}
		}
	}
	else
	{
		partE = partB / 2;
		if (partA % 2 == 0)
			partC = partA + 1;
		else partC = partA;
		for (partC; partC <= partE; partC = partC + 2)
		{
			partD = partB - partC;
			r = (unsigned int)sqrt(partC);
			for (d = 3; d <= r; d = d + 2)
			{
				if (partC % d == 0)
					d = partC + 1;
			}
			if (d != partC + 3)
			{
			r = (unsigned int)sqrt(partD);
				for (d = 3; d <= r; d = d + 2)
				{
					if (partD % d == 0)
						d = partD + 1;
				}
				if (d != partD + 3)
				{
					printf("%u由素数%u、%u和%u组成;\n", all_input, partA, partC, partD);
					sum++;
				}
			}
		}
	}
}

``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值