【请输入一个大于2的整数:】 55
【该整数的质数和表示为:】
53 + 2 = 55
/*----------------------------------------------------------------------
题目:验证欧拉猜想:任何一个大于2的整数都可以表示为不超过三个质数的和。
要求:编写程序,接受用户输入的一个大于2的整数,并输出该整数的质数和表示。运行结果如样张所示
-----------------------------------------------------------------------
注意:请勿改动主函数main和其他函数中的任何内容。
---------------------------------------------------------------------*/
#include <stdio.h>
#include <windows.h>
int isPrime(int num);
void findPrimeSum(int num);
int main() {
int number;
printf("【请输入一个大于2的整数:】 ");
scanf("%d", &number);
if (number <= 2) {
printf("【输入有误】输入错误!请输入一个大于2的整数。\n");
return 1;
}
printf("【该整数的质数和表示为:】\n");
findPrimeSum(number);
return 0;
}
int isPrime(int num) {
int i;
if (num <= 1) return 0;
for ( i = 2; i * i <= num; i++) {
if (num % i == 0) {
return 0;
}
}
return 1;
}
void findPrimeSum(int num) {
int count = 0;
int primes[3];
int i;
/**********Program**********/
int j,k;
for(i=2;i<num;i++)
{
if(isPrime(i))
for(j=2;j<num;j++)
if(i+j==num)
if(isPrime(j))
{
primes[count++]=j;
primes[count++]=i;
break;
}
if(count>0) break;
}
if(count==0)
{
for(i=2;i<num;i++)
{
if(isPrime(i))
for(j=2;j<num;j++)
{
if(isPrime(j))
for(k=2;k<num;k++)
if(i+j+k==num)
{
if(isPrime(k))
{
primes[count++]=k;
primes[count++]=j;
primes[count++]=i;
break;
}
}
if(count>0) break;
}
if(count>0) break;
}
}
/********** End **********/
if (count == 0) {
primes[count++] = num;
}
for (i = 0; i < count; i++) {
printf("%d ", primes[i]);
if (i < count - 1) {
printf("+ ");
} else {
printf("= %d\n", num);
}
}
}
要么是被拆解成两个数,要么就被拆解成三个数。如果没被拆解成两个数的话,count依旧为0,那么就去看能不能被拆解成三个数。如果两个数和三个数都被拆解不了的话,例如:3,直接把它放进primes输出它。