| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 527 人关注过本帖
标题:【求助】 帮我看看,哪里出问题了!
只看楼主 加入收藏
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
结帖率:91.43%
收藏
 问题点数:0 回复次数:3 
【求助】 帮我看看,哪里出问题了!
原题目如下:

一位商人有4块砝码,都是整数,重量不同,砝码在天平上可以称出任意1~40间的重量(砝码可以放在天平的任意一端),请问这四块砝码的重量各是多少?

我写的代码如下:
程序代码:
#include<stdio.h>

int fuction(int i,int j,int k,int l);

int main()
{
    int i,j,k,l;
    int flag=0;
    for(i=1;i<=40;i++)
        for(j=1;j<=40;j++)
            for(k=1;k<=40;k++)
                for(l=1;l<=40;l++);
                {
                    if(i!=k && k!=j && j!=l && l=i)
                    {
                        flag=fuction(int i,int j,int k,int l);
                        if(flag)
                            printf("%d\t%d\t%d\t%d\n",i,j,k,l);
                    }
                }
    return 0;
}

int fuction(int i,int j,int k,int l)
{
    int x;
    for(x=1;x<=40;x++)
    {
        int a,b,c,d,e,f,g,h;
        int flag;
        /*所有物体都不放在物体的一端时*/
        a=( (i==x) || (j==x) || (k==x) || (l==x) );
        b=( (i+j==x) || (j+k==x) || (k+l==x) || (l+i==x) );
        c=( (i+j+k==x)|| (j+k+l==x) || (k+l+i==x) );
        d=( (i+j+k+l==x) );
        /*部分砝码放在物体一端时*/
        e=( (i-j==x) || (j-k==x) || (k-l==x) (l-i)==x);
        f=( (i+j+k-l==x) || (j+k+l-i==x) || (k+l+i-j==x) || (l+i+j-k==x));

        g=( (i+j-k==x) || (i+j-l==x) || (i+k-j==x) || (i+k-l==x) || (i+l-k==x) || (i+l-j==x) ||
            (j+k-l==x) || (j+k-i==x) || (j+l-k==x) || (j+l-k==x) ||
            (k+l-i==x) || (k+l-j==x) );

        h=( (i+j-k-l==x) || (k+l-i-j==x) || (i+k-j-l==x) || (j+l-i-k=x) ||
            (i+l-k-j==x) || (k+j-i-l==x) );

        flag=a+b+c+d+e+f+g+h;
        if(flag==0)
            return 0;
    }
    return 1;
}
        


/*******注意哦**********
记得帮我挑出错误就可以了,别给我发其他的程序了,因为我已经找到答案了
谢谢啦!

这四块砝码的重量分别是1、3、9、27


**************************

[ 本帖最后由 thlgood 于 2011-3-1 12:27 编辑 ]
搜索更多相关主题的帖子: color 
2011-03-01 12:26
autumn1202
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:64
专家分:553
注 册:2011-2-21
收藏
得分:0 
按你的思路,程序里的b,c,e没列举全,而且漏了两种情况,一种是,三个砝码,其中两个跟物品放在一端,另一种情况:四个砝码,其中三个跟物品放在一边
b缺少j+l和i+j
c缺少i+j+l
e缺少i-k, j-l, 而且要加绝对值,或者你不加绝对值,默认i>j>k>l也可以,那你的e得改成i-l,而不是l-i

缺少的两种:在默认i>j>k>l的前提下,
1. 判断i-j-k, i-j-l, i-k-l,以及j -k-l即可
2. 判断i-j-k-l

if(i!=k && k!=j && j!=l && l=i)
这个判断也不全,缺少i!=j和k!=l

至于怎么保证i>j>k>l, 可以在main中   
for(l=1;l<=40;l++)
        for(k=l+1;k<=40;k++)
            for(j=k+1;j<=40;j++)
                for(i=j+1;i<=40;i++);

2011-03-01 14:33
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
1,想提个建议,您手工穷举的方法不可取;
2,我试着写了段代码,但感觉很不好,也就算给您个思路吧:

程序代码:
#include <stdio.h>
#define N 40
#define M 3

int sum(int ,int ,int ,int );
int add(int ,int ,int ,int ,int );

int main(void)
{
    int a,b,c,d;

    for(a=1;a<N;++a)
    {
        for(b=a+1;b<N;++b)
        {
            for(c=b+1;c<N;++c)
            {
                if((d=N-a-b-c)>c)
                {
                    if(sum(a,b,c,d)==N)
                    {
                        printf("%d %d %d %d\n",a,b,c,d);
                    }
                }
            }
        }
    }

    return 0;
}

int sum(int a,int b,int c,int d)
{
    int i,n=1;

    for(i=1;i<N;++i)
    {
        if(add(a,b,c,d,i))
        {
            ++n;
        }
    }

    return n;
}

int add(int a,int b,int c,int d,int n)
{
    int cc[M]={0,1,-1};
    int i,j,k,l;

    for(i=0;i<M;++i)
    {
        for(j=0;j<M;++j)
        {
            for(k=0;k<M;++k)
            {
                for(l=0;l<M;++l)
                {
                    if(n==(a*cc[i]+b*cc[j]+c*cc[k]+d*cc[l]))
                    {
                        return 1;
                    }
                }
            }
        }
    }

    return 0;
}
2011-03-01 18:18
蕙雨星
Rank: 2
等 级:论坛游民
帖 子:25
专家分:24
注 册:2011-2-23
收藏
得分:0 
那么长啊
2011-03-01 22:29
快速回复:【求助】 帮我看看,哪里出问题了!
数据加载中...
 
   



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

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