c语言去除一个数里的偶数,C语言关于一个偶数分解成两个偶数之和的问题

题目是这样:

对于用户输入一个正偶数,将其分解成两个素数之和.

#include "stdio.h"

#include "math.h"

main()

{

int m, n, k, j, x, d;

printf( "Input a number: ");

scanf( "%d", &m );

for ( n = 2; n <= m ; n++ )

{

k = sqrt( n );

for ( j = 2; j <= k; j++ )

if ( n % j == 0 )

break;

if ( j >= k + 1   )

{

x = m - n;

for ( j = 2; j <= sqrt(x); j++ )

if ( x % j == 0 )

break;

if ( j >= sqrt(x)+1    )

{

printf( "%d = %d + %d ",m, n, x );

break;

}

}

}

getch();

return 0;

}

当我输入 12 的时候结果却是 12 = 11 + 1, 却不是 12 = 5 + 7.

当我输入 13 的时候结果却是 14 = 13 + 1 ,却不是 14 = 3 + 11.

我查找 素数 是 从小到大 的顺序开始查找, 而 12 = 11 + 1, 为什么没经过 5这个素数而直接跳到 11.

我找了半天也没找到问题所在.

希望大家帮帮我.

12 个解决方案

#1

#include 

#include 

int main( )

{

int n, i, j;

printf("请输入一个正偶数:");

scanf("%d", &n);

int su[ n ];

for ( i = 0; i <= n; i++ )

su[ i ] = 0;

su[ 0 ] = su[ 1 ] = 1;

for ( i = 2; i <= n / 2; i++ )

if ( su[ i ] == 0 )

for ( j = i * 2; j <= n; j += i )

su[ j ] = 1;

for ( i = 1; i <= n / 2; i++ )

if ( su[ i ] == 0 && su[ n - i ] == 0 )

printf("%d+%d=%d\n", i, n - i, n);

return 0;

}

#2

#include 

#include 

bool isPrime(int n);

int main() {

int n = 0;

std::cout <

std::cin >> n;

for (int i = 2; i 

if (!isPrime(i) && !isPrime(n - i)) {

std::cout <

}

}

return 0;

}

bool isPrime(int n) {

int edge = (int) sqrt(n);

for (int i = 2; i <= edge; i++) {

if (n % i == 0) {

return true;

}

}

return false;

}

改为C的就行了,主要的是isPrime()和main函数中的for循环

#3

Please input an even number:

108

108 = 5 + 103

108 = 7 + 101

108 = 11 + 97

108 = 19 + 89

108 = 29 + 79

108 = 37 + 71

108 = 41 + 67

108 = 47 + 61

108 = 61 + 47

108 = 67 + 41

108 = 71 + 37

108 = 79 + 29

108 = 89 + 19

108 = 97 + 11

108 = 101 + 7

108 = 103 + 5

108 = 107 + 1

#4

谢谢大家的帮助.可是我的意思是 请大家帮我分析我程序出错的原因.....

#5

#include "stdio.h"

#include "math.h"

int main() {

int m, n, k, j, x, d;

printf("Input a number: ");

scanf("%d", &m);

for (n = 2; n <= m; n++) {

k = (int)sqrt(n);// 加了个(int)在sqrt(n)前面

for (j = 2; j <= k; j++)

if (n % j == 0)

break;

if (j >= k + 1) {

x = m - n;

for (j = 2; j <= (int)sqrt(x); j++) // // 加了个(int)在sqrt(x)前面

if (x % j == 0)

break;

if (j >= (int)sqrt(x)+1) { // 加了个(int)在sqrt(x) + 1前面

printf("%d = %d + %d ", m, n, x);

break;

}

}

}

getchar();

return 0;

}

注意到没,就是因为你没把sqrt(n)强制转换成int,所以出错。

#6

#include 

#include 

#include 

main()

{

int m, n, k, j, x, d, flag = 0; /* 定义一个flag变量,用来判断输入的偶数是否可以由两个素数组成 */

printf( "Input a number: ");

scanf( "%d", &m );

for ( n = 2; n <= m ; n++ )

{

k = (int)sqrt(n);  /* 一个致命的错误(数据丢失),应该这样 k = (int)sqrt(n)*/

for ( j = 2; j <= k; j++ )

if ( n % j == 0 )

break;

if ( j >= k + 1 )

{

x = m - n;

if (x == 1 || x == 0)  /* 0 和 1不是素数,首先就应该把他们排除掉 */

{

break;

}

/* 还有一个特殊的情况,就是当输入的 m 为 4 时,那么x = m - n 后得到 x 为 2 这种情况单独处理 */

if (x == 2)

{

flag = 1;

printf ("%d = %d + %d\n", m, n, x);

return 0;

}

/*for ( j = 2; j <= (int)sqrt(x); j++ )  这儿有问题,如果x 是 2 或 3 的时候这个循环就不执行,

但这就会错过一种情况,比如 6 = 3 + 3 这种,

应该这样写:for (j=2; j

for (j=2; j

if ( x % j == 0 )

break;

if ( j >= sqrt(x)+1 )

{

flag = 1;

printf( "%d = %d + %d ",m, n, x );

break;

}

}

}

if (!flag)

{

printf ("\n%d 不能由两个素数相加而得到\n", m);

}

getch();

return 0;

}

楼主自己检查看还有什么问题。

#7

Inhibitory()给的这个程序存在一个问题就是对于特殊值的输入 处理上有不妥 当输入m 为2时,程序还是能输出 2 = 2 + 0;

不过我上面给出的那个程序也是有点画蛇添足了。可以简单一点。

#include 

#include 

#include 

main()

{

int m, n, k, j, x, d, flag = 0; /* 定义一个flag变量,用来判断输入的偶数是否可以由两个素数组成 */

printf( "Input a number: ");

scanf( "%d", &m );

for ( n = 2; n <= m ; n++ )

{

k = (int)sqrt(n); /* 一个致命的错误,应该这样 k = (int)sqrt(n)*/

for ( j = 2; j <= k; j++ )

if ( n % j == 0 )

break;

if ( j >= k + 1 )

{

x = m - n;

if (x == 0) /* 0不是素数,首先就应该把他们排除掉 */

{

break;

}

for ( j = 2; j <= (int)sqrt(x); j++ )  /* (int)sqrt(x) */

if ( x % j == 0 )

break;

if ( j >= (int)sqrt(x)+1 )  /* (int)sqrt(x) */

{

flag = 1;

printf( "%d = %d + %d ",m, n, x );

break;

}

}

}

if (!flag)

{

printf ("\n%d 不能由两个素数相加而得到\n", m);

}

getch();

return 0;

}

#8

for ( j = 2; j <= sqrt(x); j++ )

if ( x % j == 0 )

break;

if ( j >= sqrt(x)+1    )//问题出现在这里

{

printf( "%d = %d + %d ",m, n, x );

break;

}

当判断到n = 5,x = 7的时候,运行到问题出处的位置,j = 3 ,而sqrt(x)+ 1= 3.645。。。是double类型的,j和sqrt(x)+1,j就自动提升为double类型的,所以判断条件就为false,没有输出。

有两种解决方案:

1、强制类型转换。(int)sqrt(x)

2、延续你程序开始的良好风格,把sqrt(x)赋给一个int型的变量,然后用这个变量就没问题了。

#9

谢谢大家了

#10

问题解决了,楼主不要忘了结贴

#11

楼猪记得给我蹭见分

#12

:0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值