关于如何解决将任意一个实数拆分为三个质数的问题,需要用到素数筛的知识,尽量减少不必要的计算,降低所需时间。
#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++;
}
}
}
}
}
``