编写程序,验证哥德巴赫猜想:
(1)任意一个大偶数都可以分解成两个素数之和。随机产生10个大于6的偶数进行验证,并输出每个偶数的分解结果。
(2)任意一个大奇数都可以分解为3个素数之和。随机产生10个大于5的奇数进行验证,并输出每个奇数的分解结果。
注意点:unsigned long long 和 %llu
#include <stdio.h>
int isPrime(unsigned long long n){
for(unsigned long long i=2;i<=n/2;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
int main(void) {
printf("请输入大于5的正整数:");
unsigned long long n;
scanf("%llu",&n);
while(n>0){
unsigned long long i,j,k;
if(n%2==0){
for(i=2;i<=n/2;i++){
if(isPrime(i)&&isPrime(n-i)){
printf("%llu = %llu + %llu\n",n,i,n-i);
}
}
}else{
for(i=2;i<=n/2;i++){
for(j=2;j<=n/2;j++){
for(k=2;k<n;k++){
if(i+j+k==n&&isPrime(i)&&isPrime(j)&&isPrime(k)&&i<=j&&j<=k){
printf("%llu = %llu + %llu + %llu\n",n,i,j,k);
}
}
}
}
}
printf("请输入大于5的正整数:");
scanf("%llu",&n);
}
return 0;
}
chatgpt优化版:
-
在
isPrime
函数中,增加了对小于等于1的数的判断,直接返回0,避免了不必要的计算。 -
在
decompose_odd
函数中,优化了内层循环的范围,减少了不必要的迭代次数。
#include<stdio.h>
int isPrime(unsigned long long n) {
if (n <= 1) {
return 0;
}
for (unsigned long long i = 2; i * i <= n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
void decompose_even(unsigned long long n) {
for (unsigned long long i = 2; i <= n / 2; i++) {
if (isPrime(i) && isPrime(n - i)) {
printf("%llu = %llu + %llu\n", n, i, n - i);
return;
}
}
}
void decompose_odd(unsigned long long n) {
for (unsigned long long i = 2; i <= n / 3; i++) {
for (unsigned long long j = i; j <= (n - i) / 2; j++) {
unsigned long long k = n - i - j;
if (isPrime(i) && isPrime(j) && isPrime(k)) {
printf("%llu = %llu + %llu + %llu\n", n, i, j, k);
return;
}
}
}
}
int main(void) {
unsigned long long n;
printf("请输入大于5的正整数:");
scanf("%llu", &n);
while (n > 5) {
if (n % 2 == 0) {
decompose_even(n);
} else {
decompose_odd(n);
}
printf("请输入大于5的正整数:");
scanf("%llu", &n);
}
return 0;
}