C 练习实例84
题目:一个偶数总能表示为两个素数之和。
程序分析:我去,这是什么题目,要我证明这个问题吗?真不知道怎么证明。那就把一个偶数分解成两个素数吧。
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include<stdio.h>
#include<stdlib.h>
int Isprimer(unsigned int n);
int main()
{
unsigned int n,i;
do{
printf("请输入一个偶数:\n");
scanf("%d",&n);
}while(n%2!=0);
for(i=1;i<n;i++)
if(Isprimer(i)&&Isprimer(n-i))
break;
printf("偶数%d可以分解成%d和%d两个素数的和\n",n,i,n-i);
return 0;
}
int Isprimer(unsigned int n)
{
int i;
if(n<4)return 1;
else if(n%2==0)return 0;
else
for(i=3;i<sqrt(n)+1;i++)
if(n%i==0)return 0;
return 1;
}
以上实例运行输出结果为:
请输入一个偶数: 4 偶数4可以分解成1和3两个素数的和
C 语言经典100例
HIT_CCC
117***2963@qq.com
上面的实例有问题,1不是素数,2是最小素数,正确的代码如下:
#include<stdio.h> #include<math.h> int IsPrime(int n) { int i; if(n == 1) return 0; for(i = 2; i <= sqrt(n); i++) if(n%i == 0) return 0; return 1; } void divide_even(int even,int *a,int *b) { int i; for(i = 2; i < even; i++) { if(IsPrime(i)&&IsPrime(even - i)) break; } *a = i; *b = even - i; } int main(void) { int n,a,b; printf("请输入一个偶数:\n"); scanf("%d",&n); divide_even(n,&a,&b); printf("偶数%d可以分解成%d和%d两个素数的和",n,a,b); }HIT_CCC
117***2963@qq.com
DawnEve
pos***469@163.com
提供一个函数形式,更清晰的:
#include<stdio.h> int isPrimer(int n){ int i; for(i=2; i<n; i++){ if(n%i==0){ return 0; } } return 1; } //test from n+1 int nextPrimer(int n){ int i, flag; while(1){ n++; if( isPrimer(n) ){ return n; } } } void getNprimers(int N){ int i, n=2; for(i=0; i<N; i++){ printf("质数%d = %d\n", i, n); n=nextPrimer(n); } } int main(){ //getNprimers(100); int num, i, j, flag; printf("请输入一个偶数: "); scanf("%d", &num); if(num<=0 || num%2!=0){ printf("Error: must positive even!\n"); return 1; } //开始分解 flag=0; i=1; while(i<num){ //保证一个是质数 i=nextPrimer(i); //判断另一个是不是质数 j=num-i; if(i>j){ break; } if( isPrimer(j) ){ flag=1; break; } } if(flag){ printf("%d = %d + %d\n", num, i, j); } return 0; }DawnEve
pos***469@163.com