题目是这样:
对于用户输入一个正偶数,将其分解成两个素数之和.
#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