免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: cy1013
打印 上一主题 下一主题

出道数学题 [复制链接]

wangchuan 该用户已被删除
11 [报告]
发表于 2006-03-14 22:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
12 [报告]
发表于 2006-03-15 10:24 |只看该作者
我算的是19630次,
源程序:不过没做结构化也没有注释:
#include <stdio.h>

struct troche{
        int k;
        int count;
        int number;
};

int out(struct troche *x);
int dump(struct troche *a,struct troche *b,struct troche *c);

int main()
{
        struct troche a,b,c;
       
        a.k=0;b.k=0;c.k=0;
        a.count=0;b.count=0;c.count=0;
        a.number=1997-19-97;b.number=97;c.number=19;
       
        while(1){
                if(0==a.number){
                        if((b.number<c.number)&&(0<b.number)){
                                out(&b);
                        }
                        if((c.number<=b.number)&&(0<c.number)){
                                out(&c);
                        }                       
                }
                if(0==b.number){
                        if((a.number<c.number)&&(0<b.number)){
                                out(&a);
                        }
                        if((c.number<=a.number)&&(0<a.number)){
                                out(&c);
                        }
                }
                if(0==c.number){
                        if((a.number<a.number)&&(0<a.number)){
                                out(&a);
                        }
                        if((b.number<=a.number)&&(0<b.number)){
                                out(&b);
                        }                       
                }
               
                if((0==a.number)&&(0==b.number)&&(0<c.number)){
                        out(&c);
                }
                /*
                if((0==a.number)&&(0==c.number)&&(0<b.number)){
                        out(&b);
                }
                if((0==c.number)&&(0==b.number)&&(0<a.number)){
                        out(&a);
                }*/
                               
                if((a.number<b.number)&&(a.number<c.number)&&(0<a.number)){
                        out(&a);
                }
                if((b.number<a.number)&&(b.number<c.number)&&(0<b.number)){
                        out(&b);
                }
                if((c.number<a.number)&&(c.number<b.number)&&(0<c.number)){
                        out(&c);
                }
                       
                if((0==a.number)&&(0==b.number)&&(0==c.number)){
                        break;
                }               
                if(c.number==0){dump(&a,&b,&c);}
                if(b.number==0){dump(&a,&b,&c);}
                if(a.number==0){dump(&a,&b,&c);}
                printf("a=%d,b=%d,c=%d\n",a.number,b.number,c.number);               
        }
       
        printf("sum=%d\n",a.count+b.count+c.count);       
        return(0);
}

int out(struct troche *x)
{
        if((x->k)<=100){
                x->count+=x->number;
        }
        x->number--;
        printf("x.k=%d",x->k);
        return(0);
}
int dump(struct troche *a,struct troche *b,struct troche *c)
{
        printf("********************************");
        if(0==(c->number)){
                if(19<(b->number)) {
                        (c->number)+=19;(b->number)-=19;
                        b->k++;
                        c->k=b->k;
                }else{
                        (c->number)+=19;(a->number)-=19;
                        a->k++;
                        c->k=a->k;
                }
               
        }
        if(0==(b->number)){
                if(97<(a->number)) {
                        (b->number)+=97;(a->number)-=97;
                        a->k++;
                        b->k=a->k;
                }else{
                        return(0);
                }
        }
        if(0==(a->number)){
                return(0);
        }
        return(0);
}

论坛徽章:
0
13 [报告]
发表于 2006-03-21 08:55 |只看该作者

新人报到!

呵呵,学习中......

论坛徽章:
0
14 [报告]
发表于 2006-03-21 09:00 |只看该作者

我也来个源程序

我算得的结果是39508
基本算法原理是打开C吃药,C空了,B装C,B和C空了,A装B、C,但装的药片数必须符合A>=B>=C!
没有注释!有空我来添加注释吧!


//---------------------------------------------------------------------------
#include<conio.h>
#pragma hdrstop
#include<iostream.h>
//---------------------------------------------------------------------------
#include<conio.h>
#pragma argsused
int f(int j);
int balance(int bigcup,int smallcup);
void main()
{
    int i=1997;
    int B;
    int n=0;
    for(;i>=213
    {
        int p;
        n+=i;
        i--;
        p=balance(97,19);
        n+=p;
        i-=116;
    }
    for(;(i-1)/3>=19
    {
        n+=i;
        i--;
        int ii=(i-19)/2;
        n+=balance(ii,19);
        i=i-ii-19;
    }
    for(;(i-1)/3>0
    {
        n+=i;
        i--;
        int i3=i/3;
        int i2=(i-i/3)/2;
        n+=balance(i2,i3);
        i-=i2+i3;
    }
    if(i==3)
        n+=5;
    if(i==2)
        n+=3;
    if(i==1)
        n+=1;
    cout<<"Game is over,the last number is:"<<n;
    _getch();
}   
//---------------------------------------------------------------------------
int balance(int bigcup,int smallcup)
{
    int m=0,s;
        m+=f(smallcup);
    while(bigcup>0)
    {
       m+=bigcup;
       bigcup--;
       s=bigcup/2;
       if(s>=smallcup)
       {
          m+=f(smallcup);
          bigcup-=smallcup;
       }
       else
       {
          m+=f(s);
          bigcup-=s;
       }
    }
    return m;
}
int f(int j)
{
    return j*(j+1)/2;
}

论坛徽章:
0
15 [报告]
发表于 2006-03-21 09:12 |只看该作者
我算出来的也是39508,我是用python写的

v=[1997,97,19]
s_init=[1997,0,0]
count=0

def min(s):
        result = 99999
        index=-1
        for i in range(3):
                if s[i]<result and s[i]>0:
                        result = s[i]
                        index=i
        if index==-1:
                index=0
        return index

def max(s):
        result = 0
        index=-1
        for i in range(3):
                if s[i]>result:
                        result = s[i]
                        index=i
        if index==-1:
                index=0
        return index

def count_zero(s):
        c=0
        for x in s:
                if x==0:
                        c+=1
        return c

def step( s ):
        c=count_zero(s)
        count=0
        if c==0 :
                index=min(s)
                count+=s[index]
                s[index]=s[index]-1
                return count
        elif c==1 :
                index=min(s)
                if s[0]==0:
                        index_z=0
                elif s[1]==0:
                        index_z=1
                else:
                        index_z=2
                val=s[index]
                count +=val
                if (val/2)<=v[index_z]:
                        s[index_z]=val/2
                        s[index]=val-val/2-1
                else:
                        s[index_z]=v[index_z]
                        s[index]=val-v[index_z]-1
                return count
        elif c==2 :
                if s[0]!=0:
                        index_nz=0
                elif s[1]!=0:
                        index_nz=1
                else:
                        index_nz=2
                val=s[index_nz]
                count+=val
                if val<=v[2]*3+1:
                        s[0]=val-val/3*2-1
                        s[1]=val/3
                        s[2]=val/3
                elif val<=v[1]*2+v[2]+1:
                        s[2]=v[2]
                        s[1]=(val-v[2])/2
                        s[0]=val-(val-v[2])/2-v[2]-1
                else:
                        s[2]=v[2]
                        s[1]=v[1]
                        s[0]=val-v[1]-v[2]-1
                return count
        else:
                return 0


x=step(s_init)
while x!=0:
        print x,s_init
        count+=x
        x=step(s_init)

print "total:",count
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP