| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1195 人关注过本帖
标题:[讨论]我的程序哪里有问题?
只看楼主 加入收藏
sailer
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2005-10-12
收藏
 问题点数:0 回复次数:15 
[讨论]我的程序哪里有问题?

27个人买饮料,饮料店搞促销,凭三个空瓶可以再换一瓶,他们最少买多少瓶饮料才能保证一人一瓶? 编程怎么实现啊?? #include <iostream.h> void main() { int i; int sum=0; for(i=1; i<27;i++) { sum=i; for(int j=i ;j>1;) { j= j/3; sum=j+sum; } if(sum>=27) continue; } cout<<i<<'\n'; return ; }

怎么得不到想要的结果?? 请大家赐教啊!!

搜索更多相关主题的帖子: 饮料 一瓶 continue include return 
2005-10-27 13:37
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
收藏
得分:0 
// 数学表达式:x/3 +x >=27 #include <iostream> int main() { float sum; int i; for(i=0; ;) { sum=4*i/3; if(sum>=27) break; i++; } std::cout <<i <<endl; return 0; }

[此贴子已经被作者于2005-10-27 21:28:02编辑过]


unicorn-h.spaces. ◇◆ sava-scratch.spaces.  noh enol ! pue pu!w hw u! shemle aq ll!m noh 
2005-10-27 17:06
sailer
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2005-10-12
收藏
得分:0 

呵呵

厉害啊!


希望大家多多配合他人,多多帮助他人。 支持国家的 产品,尽量不买外国货。
2005-10-28 22:42
lzyren2008
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2007-8-12
收藏
得分:0 


#include <iostream.h>
void main()
{
int k,i;
int sum=0;
for(i=1; i<27;i++)
{

sum=i;
for(int j=i ;j>1;)
{
if(j>3) //无此条件会导致死循环
k=j%3; //多出的个数
j= j/3;
sum=j+sum;
j=j+k;
k=0;
}
if(sum>=27)
break;

}
cout<<i<<'\n';
return ;
}
结果19

2007-08-12 18:39
wangweicoin
Rank: 1
等 级:新手上路
威 望:1
帖 子:58
专家分:0
注 册:2007-7-16
收藏
得分:0 
#include<iostream>
using namespace std;
int main()
{
int a; //购买的数量;
for(a=0;a<27;a++)
if(a+a/3+a/9==27)
cout<<a<<endl;
return 0;
}
答案是19

~我的人生不是套公式~
2007-08-12 22:32
terisevend
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2007-6-2
收藏
得分:0 


这问题之前看过...那时写了个可以计算有N人数,买X送Y,求最少购买数的程序...当然...有比这更好的程序...如果谁有的话,请POST出来交流一下...太久了...现在不想做这程序的优化工作...
之前看到的贴中,有人POST出了数学解法,不过那是对于搂主的问题,已证明了那个数学解法不能解同一类问题...

[CODE]
#include <cstdlib>
#include <iostream>

using namespace std;

void least_x( const int, const int, const int );

int main( int argc, char *argv[] )
{

int x, y, s;

do{
cout << "请输入人数:"; cin >> s;
cout << "请分别输入有多少瓶子送多少水的数,如 5 2:"; cin >> x >> y;

if( y >= x )
cout << "你做亏本生意啦!请重新输入吧!" << endl;
else
{
cout << endl;
break;
}
}while(1);

least_x( x, y, s );
system("PAUSE");
return EXIT_SUCCESS;
}

void least_x( const int x, const int y, const int s )
{
int _x = 0, //累积购买数
_y = 0, //累积获赠数
_s = 0, //累积总数
_t = 0, //空瓶剩余数
_tmp = 0, //存储每次获得的赠送数
_more = 0; //多出来的赠品水

while( _s < s ) //判断累计总数是否大于计划购买总数,如果大于等于,则表明全部人都又有水了
{
if( (s-_s>=x+y) && (_t+y<x) ) //判断剩下没买的是否大于购买数加赠送数且空瓶数是否不足以赠送水
{ //如果上述均为真,则只要让其相对增加规定量即可
_t+=y; _x+=x;
_y+=y; _s+=(x+y);

if( _s >= s )
_s = s;
}

else if( (s-_s>=x+y) && (_t+y>=x) ) //判断与上述差不多
{ //如果上述为真,则需要求得买这次水总共赠送了多少瓶水
_x+=x; _t+=y;
_tmp+=y; _t=_t%x+y;

while( _t >= x )
{
_tmp+=y; _t=_t%x+y;
}

_y += (y + _tmp); _s = _y + _x; _tmp = 0;

if( _s >= s )
_s = s;
}

else if( (s-_s<x+y) && (_t+s-_s<x) ) //判断与上述差不多,至于第二判断,是判断空瓶数加上剩余数是否大
//于可赠送数
{ //如果为真,则让购买数加上剩余数,且可以确定,已经购买够水了
_x += s - _s; _s = s;
}

else if( (s-_s<x+y) && (_t+s-_s>=x) ) //判断与上述差不多
{ //如果目前空瓶数加上剩余数后,是否满足赠送数
for( int i = 1; i <= s - _s; i++ ) //如果满足,则说明在1->s-_s间,存在一个最小数,使得购买数最小
{
_t+=1; //递增查找

if( _t>=x ) //如果空瓶数大于可赠送数的话,则说明空瓶数换得新水瓶后,可能全部人都有水
{
_tmp+=y; _t=_t%x+y; //求得空瓶数可以换得多少新水瓶

while( _t >= x )
{
_tmp+=y; _t=_t%x+y;
}

if( _tmp >= s-_s - i ) //如果新水瓶加上购买大于等于剩余数的话,则说明已经买够水
{ //让购买数加上这次购买数,则得到最少购买数,同时,求得总共赠送了多少瓶水
_y+=_tmp;
_x+=i; _s=s; break;
}
}
}

_tmp = 0;

}


if( _y - (s - _x) > 0 )
_more = _y - (s - _x);
else
_more = 0;

cout << "总购买数为:" << _x << endl
<< "赠品水共有:" << _y << endl
<< "多出的赠品水有:" << _more << endl
<< "共需要水:" << _s << endl
<< "共有水: " << _x + _y << endl << endl;
}

cout <<"至少买 " << _x << " 瓶水!" << endl;

}

[/CODE]

[此贴子已经被作者于2007-8-12 23:39:45编辑过]


2007-08-12 22:51
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
是不是还要计算下"总数+1"的情况?
以完成最后剩2个空瓶"借1还1"的情况...

女侠,约吗?
2007-08-12 23:29
terisevend
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2007-6-2
收藏
得分:0 
我给出的代码有计算这个...运行程序: 输入27 3 1
最后结果为
购买数为19
共赠送9瓶水
多出的赠品水为1

而至于1个瓶子换1瓶水...这个归入亏本生意范围...
不知道对野比您的问题是否理解正确

2007-08-12 23:37
wwyinhuabin
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-8-10
收藏
得分:0 

#include<iostream.h>
void main(){
int i=0;

for(int j=1;j+i<=27;j++)
{

if(27-i-j>=3&&j%2==0)
i++;

}

cout<<27-i<<endl;
}
这样好象也可以

2007-08-13 01:40
wwyinhuabin
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-8-10
收藏
得分:0 
如果 是野比的想法的话 就只需要把 IF语句里的第一个条件去掉 为了提高性能 应该把第二个条件写在前面 
2007-08-13 01:42
快速回复:[讨论]我的程序哪里有问题?
数据加载中...
 
   



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

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