社区
C语言
帖子详情
求大神帮忙看下这道题
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
打赏
收藏
求大神帮忙看下这道题
1.编程实现在一个9位数的正整数n中插入4个乘号,使分得的5个整数的乘积最大; 2.输入 n 3.输出 被分得的5个整数、得到的最大乘积 4.例如:输入 734019862 输出 73*401*9*8*62=130674672 算法上怎么实现,或者给点思路吧,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
前端面试题、技术积累、Vue、JS、HTML、ES6
持续更新前端面试题 还请
大神
一起进行技术交流,评论 如果错误的地方请
帮忙
指正一下
python练习
这里有一份练习题,由于是网上的朋友自己编一些数据给我,让我当作练习题来熟悉。由于没给我正确答案。麻烦各位
大神
帮忙
做一下,以便我能对照一下是否做的准确。
AJAX 必看实战精讲(
大神
必经之路)
AJAX = Asynchronous JavaScript and XML(异步... AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。 AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
C++小白
求
大神
帮忙
解答一下
这道题
从键盘输入一个4位数的整数,编程计算并输出它的逆序数(忽略整数前的正负号)。例如,输入-1234,忽略负号,由1234分离出其千位1、百位2、十位3、个位4,然后计算41000+3100+2*10+1 = 4321,并输出4321。再将得到的逆序数4321拆分为两个2位数的正整数43和21,计算并输出拆分后的两个数的平方和的结果。 ...
用java编写圆锥_
求
java
大神
帮忙
求
大神
帮助!Java
导航:网站首页 >
求
java
大神
帮忙
求
大神
帮助!Java
求
java
大神
帮忙
求
大神
帮助!Java相关问题:匿名网友:普通类public class CircularA {//
求
圆的表面积public double surfaceArea(double radius) {return 4*Math.PI*radius*radius;}//圆内接正方形面积public double withi...
C语言
69,336
社区成员
243,078
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章