标题:求dalao帮帮忙╥﹏╥...
只看楼主
温酒斩化腾
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2017-3-28
结帖率:72.73%
已结贴  问题点数:20 回复次数:4 
求dalao帮帮忙╥﹏╥...
我想把150到200之间的偶数分解为两个素数相加的形式,半天搞个代码还不行。。请指教
#include<stdio.h>
#include<math.h>
int main()
{
    int i,j,l,flag=1,k;
    for(i=150;i<=200;i+=2)
    for(j=1;j<=199;j++)
    {
        
        for(l=2;l<=(int)sqrt(i-j)&&flag;l++)
        for(k=2;k<=(int)sqrt(j)&&flag;k++)
        {
        if((i-j)%l==0||j%k==0)
        flag=0;
        else
        printf("%d=%d+%d\n",i,i-j,j);}
   }
            
        
        
        
   
}
搜索更多相关主题的帖子: include 
2017-03-28 22:30
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:5 
程序代码:
#include <stdio.h>

int
prime( int value );

int
main( void )
{
    int low, high;
    int n;

    low = 150;
    high = 200;

    while( low <= high )
    {
        if( low % 2 )
        {
            low++;
            continue;
        }

        for( n = 2; n < low; n++ )
            if( !prime( n ) )
                if( !prime( low - n ) )
                {
                    printf( "%d = %d + %d\n", low, n, low - n );
                    break;
                }

        low++;
    }

    return 0;
}

int
prime( int value )
{
    int n;


    for( n = 2; n * n < value; n++ )
    {
        if( !( value % n ) )
            return 1;
    }

    if( n * n > value )
        return 0;
    else
        return 1;
}

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-29 09:10
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 
#include <stdio.h>
#include <math.h>

int _IsPrimer(int n)
{
    int i, k=sqrt(n);
    for (i=2; n%i!=0 && i<=k; i++) NULL;
    return (i > k);
}

main()
{
    int i,j,l,flag=1,k;
    for(i=150; i<=200; i+=2)
        for(j=2; j<=sqrt(i); j++)
            if (_IsPrimer(j) && _IsPrimer(i-j))
                printf("%d=%d+%d\n",i,j,i-j);
}
2017-03-29 09:59
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:10 
回复 楼主 温酒斩化腾
题主是个新手吧,我没有像楼上两位把你的代码思路直接全改了,因为毕竟我也是从新手过来的,知道那样解决不了问题
但我不得不批评下,改你这程序实在害人,一开始以为可能只是一处两处的逻辑错误,后来才发现这逻辑错误真是不止一点啊。。。
你调试的出来才见鬼,,
三点建议:1,新手做题请务必打草稿,把思路弄清
2,尽快学会一些简单的调试方法,你这个程序我一  添加查看l的值就发现了问题
3,用flag不如用break或continue,逻辑不容易混乱
#include<stdio.h>
#include<math.h>
int main()
{
    int i,j,l,flag=1,k;
    for(i=150;i<=200;i+=2,flag=1) //将flag复归原值是个很重要也需要注意的问题,初学者经常犯错
    for(j=2;j<=i/2;j++,flag=1)//判断条件这里可以修改为i/2,因为大于i/2和小于i/2等价 ,但199,绝对不可以,因为都这样i-j可能为负
    {
        
        for(l=2;l<=(int)sqrt(i-j)&&flag;l++)
        for(k=2;(k<=(int)sqrt(j))&&flag;k++)
        {
        if((i-j)%l==0||j%k==0)//你这里严重逻辑错误,按你的每次循环一开始就j=2,k=2,所以你的程序一运行,flag就等于零,循环终止 ,所以我在j循环里加了flag=1
        {
            flag=0;
        }
        if(l==(int)sqrt(i-j)&&k==(int)sqrt(j))//你这里逻辑也错误啊,并不是 不满足(i-j)%l==0||j%k==0, 就可以证明两个数是素数,而是要把所有的l,k尝试完才行
        {
        printf("%d=%d+%d\n",i,i-j,j);
        flag=0;
        }
    }
    }
    return 0;//还有这里加上return 0是个基本常识,因为可以根据返回值判断程序是否运行正确  
}

............
2017-03-29 16:39
温酒斩化腾
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2017-3-28
得分:0 
回复 3楼 吹水佬
请问这里的NULL是干什么的
2017-03-29 16:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475602-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.228855 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved