| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1482 人关注过本帖
标题:关于一道题的解法和我解法的错误之处
只看楼主 加入收藏
zkkpal
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-7-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:26 
关于一道题的解法和我解法的错误之处
一家公司会计准备给5个工人发工资,但她并没有数总共的钱数时有事出去了。要得到工资的这几个人分别是A,B,C,D,E。A首先看到了那些钱,于是他把那些钱平均分成5份,但多了1元,A想,1元叫他们分太麻烦了,于是A拿走了1/5和一元;A走之后,B又看到了那些剩下的钱,于是和A想的一样,B把剩下的钱分了1/5,也多出一元,于是拿走了剩下的1/5和一元。C,D,E同样。最后等会计回来的时候剩下的钱刚好能平均分成五份。问最初最少会有多少钱。

请大家给出你们的解法。

下面这个是我的思路:
#include<stdio.h>
#include<stdlib.h>
main()
{
    float x=1,n;
    int y;

      while(y%5!=0)
      {
                  
        for(n=1;n<=5;n++)
        {
         x=(x/0.8)+1;
         }
   
       y=x;
 
       x++;
       }
    printf(%d,y)
     system("pause");
}

由于float不能=int
所以有错误
谁知道如何修改

[ 本帖最后由 zkkpal 于 2009-8-19 22:04 编辑 ]
搜索更多相关主题的帖子: 循环 
2009-08-19 22:02
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:0 
确实是有问题,我审题没审明白。
A走之后,B又看到了那些剩下的钱,于是和A想的一样,B把剩下的钱分了1/5,也多出一元,于是拿走了剩下的1/5和一元

这句话是什么意思?
B把剩下的钱分了1/5,也多出一元?不懂。

[ 本帖最后由 soler 于 2009-8-20 01:04 编辑 ]
2009-08-19 23:37
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:10 
不对吧,num/5-1?  应该是(num-1)%5==0才对呀。

设A看到的总数AX   (AX-1)/5*4=BX
设B看到的总数BX   (BX-1)/5*4=CX
设C看到的总数CX   (CX-1)/5*4=DX
设D看到的总数DX   (DX-1)/5*4=EX
设E看到的总数EX   (EX-1)%5余数等0
main()
{
 int i,j,x,y,n;
 for(i=5;i<10000;i++)
   {
    if(i%5==1)
      {
       x=i;
       n=1;
       for(j=1;j<=n;j++)
     {
      y=(int)(((float)x/4)*5+1);
      x=y;
      if(y%5==1)
        {
         /*y=(int)(((float)x/4)*5+1);*/
         n++;
        }
          if(n==5)break;
     }
       if(n==5)
     {
      printf("zong gong zhi=%d\n",y);
     }
      }
   }
 printf("\n");
}

算出的数有:
3121
6246
9371
12496
15621
18746
21871
  .
  .
  .

[ 本帖最后由 UserYuH 于 2009-8-20 00:32 编辑 ]

努力—前进—变老—退休—入土
2009-08-20 00:03
zkkpal
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-7-26
收藏
得分:0 
恩,你的解法得数的确正确,你用强制转换解决的这个问题,可是为什么我用强制转换就会出问题呢。
#include<stdlib.h>
#include<stdio.h>
main()
{
    int x,y,z,n;


      for(x=1;x<=100000;x++)
      {
                  
        for(n=1;n<=5;n++)
        {
         x=(int)((float)x/0.8)+1;
        y=x;
           if(y%5==1)
            {
                      z++;
            }
         }
        
       if(z==5) break;

 
       }
    printf("%d\n",x);
 system("pause");
}
还有另一个也有问题
#include<stdlib.h>
#include<stdio.h>
main()
{
       int i,x,a;
       a=5;
       while (a>0)
        {  for (i=1;i<=5;i++)
             {
             x=(5*a+4)/4;
             a=x;
             if (x%5!=1) break;
             }
            if(x%5==1) break;
            else
               {
               a=a+5;
               
               }
        }
   printf("%d",x);
   system("pause");
}
你能给解释一下,这两个出的问题么

[ 本帖最后由 zkkpal 于 2009-8-20 13:21 编辑 ]
2009-08-20 12:09
liu1987lang
Rank: 2
等 级:论坛游民
帖 子:42
专家分:44
注 册:2007-4-22
收藏
得分:0 
逆向考虑,既然最后剩的钱是5的倍数,那么凡是能被5整除的都有可能是剩余的钱数,剩余的钱数是e拿了1快钱之后的4/5,由此就得到了d拿了钱之后剩下的钱,以此类推5次就能得到工资总数。我的程序如下
程序代码:
 main()  
{  
    int i,j,sum; 
    for(i=5;i<10000;i++) 
    { 
        if(i%5==0) 
        { 
            sum=i; 
            for(j=0;j<5;j++) 
            { 
                sum=sum*1.25+1; 
            } 
            printf("the total maney is:%d\n",sum); 
        } 
    } 
}
2009-08-20 13:14
zkkpal
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-7-26
收藏
得分:0 
楼上的算法是错误的
2009-08-20 13:23
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
说明一下,6246是不正确的结果,为什么呢?分析如下:

剩余    人物      拿走
6246     A        1249+1=1250
4996     B        999+1=1000
3996     C        799+1=800
3196     D        639+1=640
2556     E        511+1=512
2044     会计  (注意这句话:最后等会计回来的时候剩下的钱刚好能平均分成五份。)

对会计来说显然不成立了.
我的程序:
#include <stdio.h>
#define NUM 5          //会计之前的人数   
 
void calculate(int n,int i)
{
 while(n--)
 {
  if(i%4!=0) return;
  i=i*5/4+1;
 }
 printf("%d\n",i);
}
 
int main()
{
 int i;  
 for(i=0;i<10000;i+=20)         
    calculate(NUM,i);
 return 0;
}
2009-08-20 14:42
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
设总钱数为:t,ABCDE每次取的钱:abcde,每次取完后剩余:ta tb tc td te
 
由te==4*(e-1);te/5是整数,则(e-1)*4/5是整数;则(e-1)是5的倍数,所以te==4*(e-1)是20的倍数,  
设te=20*n (n是整数,n>=1)
 
名字  取钱数  剩余
 
E     e       te==20n
D     d       td
C     c       tc
B     b       tb
A     a       ta
总数          t
 
 
根据描述:   
 
t==5*a-4
a=t-ta
 
 
解得:
 
a==f1(ta)==ta/4+1
t==f2(a)==5*a-4   
 
程序代码如下(累呀,因为要写好看些,哈哈~~):


//mainc.c
//********************************

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define MAXN 4000  //修改这个值可以限定最终剩余的范围*******


double f1(int x);
double f2(int x);
bool IsInteger(double x);
bool Solve(int x,int accarr[]);
bool Show(int accarr[]);
//=====================================================================
int main()
{
    int accarr[11];
    int n,te;
    for(n=0;te<MAXN;)
    {
        n++;  //注意这里的n++;不能放在for循环内,不然loops的值在没达到MAXN和达到MAXN结果不同
        te=n*20;
        //te=n*5;  //结果是一样的,不过每次多循环了3次********
        if(Solve(te,accarr))
        {
            Show(accarr);
            break;  //注释掉这个语句,就可以查找多个值。********
        }
        else
            ;
    }
    printf("%d loops! \ndone!",n);
}

//------------------------------------------------------------------

double f1(int x)
{
    return (double)x/4+1;//只要把x转换为double,整个表达式就是double型了。
}

double f2(int x)
{
    return (double)x*5-4;
}

bool IsInteger(double x)
{
    return (x==(int)x)?true:false;
}
//------------------------------------------------------------------
bool Solve(int x,int accarr[])
{

    int i;
    double dx=(double)x,df1;
    for(i=0;i<5;i++)
    {
        accarr[2*i]=(int)dx;
        if(IsInteger(df1=f1((int)dx)))
        {
            accarr[2*i+1]=(int)df1;
            if(IsInteger(dx=f2((int)df1)))
                ;
            else
                return false;
        }
        else
            return false;
    }
    accarr[10]=(int)dx;
    return true;
}

bool Show(int accarr[])
{
    printf("name  money remain\n");
    printf("E     %-6d%-6d\n",accarr[1],accarr[0]);
    printf("D     %-6d%-6d\n",accarr[3],accarr[2]);
    printf("C     %-6d%-6d\n",accarr[5],accarr[4]);
    printf("B     %-6d%-6d\n",accarr[7],accarr[6]);
    printf("A     %-6d%-6d\n",accarr[9],accarr[8]);
    printf("TOTAL       %-6d\n",accarr[10]);
    printf("------------------\n",accarr[10]);
    return true;
}

[ 本帖最后由 wsj3000 于 2009-8-20 17:05 编辑 ]
2009-08-20 16:51
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
楼上的结果是这样的:

name  money remain
E     256   1020
D     320   1276
C     400   1596
B     500   1996
A     625   2496
TOTAL       3121
------------------
51 loops!
done!
2009-08-20 16:54
prs09
Rank: 1
等 级:新手上路
帖 子:5
专家分:5
注 册:2009-7-20
收藏
得分:0 
楼上的牛啊
2009-08-20 17:34
快速回复:关于一道题的解法和我解法的错误之处
数据加载中...
 
   



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

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