面试的时候的一道题.

Mrxuhao 2005-03-12 06:14:54
有若干 一角钱,二角钱,五角钱.写出一段代码来显示所有可能让这些钱组成一块钱的的算法.
...全文
636 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypengfei 2005-03-16
  • 打赏
  • 举报
回复
从软件工程角度来讲,穷举是最好了。

-----------------------
short five,two;
double one;
for(five=0;five<=2;five++)
for(two=0;two<=int((1-0.5*five)/0.2);two++)
{
one = (1-0.5*five-0.2*two)/0.1;
if(one==1.0*int(one))
{
cout<<five<<two<<int(one)<<endl;
}
}
------------------
上边这个你累不累啊,性能差异有多大?
顶多是自己玩玩,穷举比这个要好多了。

不知道你整天写这个玩意烦不烦,没准过那么两天就再看就不懂了。
baqiao1211 2005-03-15
  • 打赏
  • 举报
回复
百花齐放,百家证明
cqwty 2005-03-14
  • 打赏
  • 举报
回复
回复人: xxxdg(学习中) ( ) 信誉:100 2005-03-13 15:45:00 得分: 0


回复人: quanchong(拳崇) ( ) 信誉:99 2005-03-12 18:51:00 得分: 0


倒~~根本不用动脑筋么。穷举就行了,连剪枝都不用。

for (i=0; i<=2; i++) //i代表5角钱的个数
for (j=0; j<=5; j++) //j代表2角钱的个数
for (k=0; k<=10; k++) //j代表1角钱的个数
if (5*i+2*j+1*k == 10)
cout<<"5*"<<i<<"+2*"<<j<<"+1*"<<k<<endl;

-----------------------------------------------------------------
太浪费了,循环比较太多了,得执行198次判断
-----------------------------------------------------------------

short five,two;
double one;
for(five=0;five<=2;five++)
for(two=0;two<=int((1-0.5*five)/0.2);two++)
{
one = (1-0.5*five-0.2*two)/0.1;
if(one==1.0*int(one))
{
cout<<five<<two<<int(one)<<endl;
}
}

次数:
6+3次循环


---------------------------------------------------------------------------------
顶一下这种算法
strugglinggrass 2005-03-14
  • 打赏
  • 举报
回复
#include<stdio.h>
int main(int argc,char*argv[])
{
FILE *fp;
fp=fopen("result.txt","w");
int i,j,k,m=0;
for (i=0; i<=2; i++) //i代表5角钱的个数
for (j=0; j<=5; j++) //j代表2角钱的个数
for (k=0; k<=10; k++) //j代表1角钱的个数
if (5*i+2*j+1*k == 10)
{
m++;
fprintf(fp,"5*%d+2*%d+1*%d\n",i,j,k);
}
fprintf(fp,"%d\n",m);
fclose(fp);
return 0;
}
不知道这样可以吗?呵呵,欢迎大家指出缺点啊!
FlyWithJo 2005-03-14
  • 打赏
  • 举报
回复
支持穷举法!这是最快解决问题的方法
thuers 2005-03-14
  • 打赏
  • 举报
回复
UP
weastsea 2005-03-14
  • 打赏
  • 举报
回复
K
xxxdg 2005-03-14
  • 打赏
  • 举报
回复
回复人: krh2001(边城浪子) ( ) 信誉:100 2005-03-13 22:15:00 得分: 0


支持一楼! 既然没要求用循环搜索, 这样写完全符合要求!



呵呵,可能你对面试者看得更善良
Mrxuhao 2005-03-13
  • 打赏
  • 举报
回复
答案就是:quanchong(拳崇) 差不多这种型式的。
jerry 2005-03-13
  • 打赏
  • 举报
回复
支持一楼! 既然没要求用循环搜索, 这样写完全符合要求!
hongjing 2005-03-13
  • 打赏
  • 举报
回复
for (i=0; i<=2; i++) //i代表5角钱的个数
for (j=0; j<=5; j++) //j代表2角钱的个数
for (k=0; k<=10; k++) //j代表1角钱的个数
if (5*i+2*j+1*k == 10)
cout<<"5*"<<i<<"+2*"<<j<<"+1*"<<k<<endl;

楼上说的对!
arbeisi210 2005-03-13
  • 打赏
  • 举报
回复
倒,希望大家以后在楼主没有强烈提出问题实现的情况下,只给思路和算法建议,不要动不动就贴上自己的代码,鱼渔关系,望大家斟酌......
ycom__net 2005-03-13
  • 打赏
  • 举报
回复
貌似c语言书上的原题呀
yuchengliu 2005-03-13
  • 打赏
  • 举报
回复

不错!
回复人: xxxdg(学习中) ( ) 信誉:100
short five,two;
double one;
for(five=0;five<=2;five++)
for(two=0;two<=int((1-0.5*five)/0.2);two++)
{
one = (1-0.5*five-0.2*two)/0.1;
if(one==1.0*int(one))
{
cout<<five<<two<<int(one)<<endl;
}
}

次数:
6+3次循环
xxxdg 2005-03-13
  • 打赏
  • 举报
回复
回复人: quanchong(拳崇) ( ) 信誉:99 2005-03-12 18:51:00 得分: 0


倒~~根本不用动脑筋么。穷举就行了,连剪枝都不用。

for (i=0; i<=2; i++) //i代表5角钱的个数
for (j=0; j<=5; j++) //j代表2角钱的个数
for (k=0; k<=10; k++) //j代表1角钱的个数
if (5*i+2*j+1*k == 10)
cout<<"5*"<<i<<"+2*"<<j<<"+1*"<<k<<endl;

-----------------------------------------------------------------
太浪费了,循环比较太多了,得执行198次判断
-----------------------------------------------------------------

short five,two;
double one;
for(five=0;five<=2;five++)
for(two=0;two<=int((1-0.5*five)/0.2);two++)
{
one = (1-0.5*five-0.2*two)/0.1;
if(one==1.0*int(one))
{
cout<<five<<two<<int(one)<<endl;
}
}

次数:
6+3次循环
宋宝华 2005-03-12
  • 打赏
  • 举报
回复
支持
--------------------------
倒~~根本不用动脑筋么。穷举就行了,连剪枝都不用。

for (i=0; i<=2; i++) //i代表5角钱的个数
for (j=0; j<=5; j++) //j代表2角钱的个数
for (k=0; k<=10; k++) //j代表1角钱的个数
if (5*i+2*j+1*k == 10)
cout<<"5*"<<i<<"+2*"<<j<<"+1*"<<k<<endl;
dongpy 2005-03-12
  • 打赏
  • 举报
回复
int store[3];
const int mny[3] = {1,2,5};
void Output()
{
for(int i=0; i<3; ++i)
{
if(store[i] != 0)
printf("%d个%d角 ",store[i],mny[i]);
}
printf("\n");
}

void comput(int left, int idx)
{
if(left < 0 || idx < 0) return;

int num = left/mny[idx];
if(left % mny[idx] ==0 && num > 0)
{
store[idx] = left / mny[idx];
Output();
if(idx == 0) return;
}

for(int i=0; i<num+1; ++i)
{
store[idx] = i;
comput(left - i*mny[idx], idx - 1);
}
}

int main(int argc, char* argv[])
{
comput(10, 2);
return 0;
}
dongpy 2005-03-12
  • 打赏
  • 举报
回复
就是求组合系数。
quanchong 2005-03-12
  • 打赏
  • 举报
回复
倒~~根本不用动脑筋么。穷举就行了,连剪枝都不用。

for (i=0; i<=2; i++) //i代表5角钱的个数
for (j=0; j<=5; j++) //j代表2角钱的个数
for (k=0; k<=10; k++) //j代表1角钱的个数
if (5*i+2*j+1*k == 10)
cout<<"5*"<<i<<"+2*"<<j<<"+1*"<<k<<endl;
fufangpeng 2005-03-12
  • 打赏
  • 举报
回复
建议用银行家算法的思想.从大到小的组合,用数组保存1,2,5.三个数.先是选择5,第二次选择从里面从新选择加起来等于10的组合.注意的问题是考虑重复组合.
加载更多回复(1)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧