求大神帮忙看下这道题

lian_2010 2012-08-25 11:15:30
1. 编程实现在一个9位数的正整数n中插入4个乘号,使分得的5个整数的乘积最大;

2. 输入 n

3. 输出 被分得的5个整数、得到的最大乘积

4. 例如:输入 734019862
输出 73*401*9*8*62=130674672

算法上怎么实现,或者给点思路吧,谢谢!
...全文
457 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao_julians 2012-08-27
  • 打赏
  • 举报
回复
正如楼上诸位所述,穷举次数只有70次(8!/4!/(8-4)!),代价不大了。也许设计一个生成nextCombination()函数能使程序结构更好些。
cao_julians 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
那个只是首位估算,首位相同的话,那就只能在估算次位了,那就比较麻烦了,但应该比穷举好一点吧
[/Quote]
无重复数字时,可以。但重复时要复杂了,例如
2222分成两个数
2*222=444
22*22=484
是穷举比较还是找一个选取规则?
yiqie520asd 2012-08-27
  • 打赏
  • 举报
回复
那个只是首位估算,首位相同的话,那就只能在估算次位了,那就比较麻烦了,但应该比穷举好一点吧
yiqie520asd 2012-08-27
  • 打赏
  • 举报
回复
找出9个数中最大的5个数,作为5个数的首位将九位数截断
赵4老师 2012-08-27
  • 打赏
  • 举报
回复
先排除0和1?
cao_julians 2012-08-27
  • 打赏
  • 举报
回复
只拿原题目中的数据做测试。
/*******************************************
1. 编程实现在一个9位数的正整数n中插入4个乘号,使分得的5个整数的乘积最大;

2. 输入 n

3. 输出 被分得的5个整数、得到的最大乘积

4. 例如:输入 734019862
输出 73*401*9*8*62=130674672

**********************************************/
#include <stdio.h>
#include <stdlib.h>
int getInteger( int a[], int start, int last)
{
int k;
int product=a[start];
for( k=start+1; k<last; k++)
product=product*10+a[k];
return product;
}
int main(int argc, char *argv[])
{
int a[9]={ 7, 3, 4, 0, 1, 9, 8, 6, 2 };//原题目数据
int b[5];
int product=1;
int max=0;
int maxb[5];
int p1,p2,p3,p4;
int k;
for(p1=1; p1<6; p1++)
{
b[0]= getInteger(a, 0, p1);
for(p2=p1+1; p2<7; p2++)
{
b[1]= getInteger(a, p1, p2);
for( p3=p2+1; p3<8; p3++ )
{
b[2]= getInteger(a, p2, p3);
for(p4=p3+1; p4<9; p4++)
{
b[3]=getInteger(a, p3, p4);
product=b[4]=getInteger(a, p4, 9);
for(k=0; k<4; k++)
product*=b[k];
if( product>max )
{
max=product;
for( k=0;k<5; k++ )
maxb[k]=b[k];
}
}
}
}
}
printf("\n Max is %d = %d",max,maxb[0]) ;
for( k=1; k<5; k++ )
printf(" * %d",maxb[k]);
printf("\n");


system("PAUSE");
return 0;
}
庄鱼 2012-08-27
  • 打赏
  • 举报
回复
同数加权问题,3,2,1小数问题,按数论的规律,合并数比乘积数要大,111111111=> 11111*1*1*1*1 << 11*11*11*111;即逢0、1、2、3尽可能的合并
庄鱼 2012-08-27
  • 打赏
  • 举报
回复
457869032 => 9 8 7 6 5 4 3 2 0 => 45 *7 *8 *6 *9032 = 136563840
smsgreenlife 2012-08-26
  • 打赏
  • 举报
回复
再牛也只能穷举,充其量在穷举的基础上优化一下。
[Quote=引用 5 楼 的回复:]
我目前想到的也只有穷举
坐等牛人
[/Quote]
smsgreenlife 2012-08-26
  • 打赏
  • 举报
回复
就算没有0,如果是9个1,你的算法结果为11111*1*1*1*1显然小于11*11*11*11*1,也是不对的。
如果没有0也没有1,那么22222*2*2*2*2<22*22*22*22*2,也是不对的
byncz 2012-08-26
  • 打赏
  • 举报
回复
8楼的方法看起来不错。
smsgreenlife 2012-08-26
  • 打赏
  • 举报
回复
就算不是插入,你的算法显然也不对,如果9位数中有一个0,那么你的算法结果就为0,显然0不是最大的!
smsgreenlife 2012-08-26
  • 打赏
  • 举报
回复
大哥,人家是“在一个9位数的正整数n中插入4个乘号”,9位数字的排列顺序不能改变。
[Quote=引用 8 楼 的回复:]
简单啊,9位数分成5份,将9位数依大至小排列,取前5位数为首进行分割即可。
[/Quote]
庄鱼 2012-08-26
  • 打赏
  • 举报
回复
[Quote=引用]#8 如何证明上述方案为最大?[/Quote]
不知楼上对基础数论是否了解?证明起来就比较啰嗦,估计这里没多少人有兴趣,不过,你可以任意找些数验证一下。
supersonic0410 2012-08-26
  • 打赏
  • 举报
回复
#8 如何证明上述方案为最大?
庄鱼 2012-08-26
  • 打赏
  • 举报
回复
简单啊,9位数分成5份,将9位数依大至小排列,取前5位数为首进行分割即可。
xiaohao91 2012-08-26
  • 打赏
  • 举报
回复
也感觉只能穷举,期待更好的解答
孤雨 2012-08-26
  • 打赏
  • 举报
回复
我目前想到的也只有穷举
坐等牛人
JKhere 2012-08-25
  • 打赏
  • 举报
回复
2楼的办法复杂度比较低,但正不正确不敢下结论。
smsgreenlife 2012-08-25
  • 打赏
  • 举报
回复
从八个位置里选四个,然后分别计算取最大的,这个还不简单?这是最笨的方法,也是唯一的方法,这种问题除了遍历没有其他的方法!
加载更多回复(2)

69,336

社区成员

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

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