热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求大神帮忙看下这道题

1.编程实现在一个9位数的正整数n中插入4个乘号,使分得的5个整数的乘积最大;2.输入n3.输出被分得的5个整数、得到的最大乘积4.例如:输入734019862
1. 编程实现在一个9位数的正整数n中插入4个乘号,使分得的5个整数的乘积最大;

2. 输入 n

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

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

  算法上怎么实现,或者给点思路吧,谢谢!

22 个解决方案

#1


如果只是9位数,如果只是插入4个乘号,其实复杂度不是很高的
8个位置上插入4个乘号,组合数C4/8 = 70

计算70次 , 然后取最大的
穷举效率低是低了,不过是最简单的实现

首先将9位数的每位数组放入一个数组
然后根据乘号的不同位置分别计算
貌似是4层的循环……

#2


分解n为9个数字存入数组的第0--第8个元素中
最大乘积设为max=0
五个整数全设为0
第一个乘号的位置p1在第1--第5元素前(循环)
{p1前的元素连乘拼合第一个整数
第二个乘号的位置p2在p1+1--第6元素前(循环)
{p2前的元素拼合为第二个整数
第三个乘号的位置p3在p2+1--第7元素前(循环)
{p3前的元素拼合为第三个整数
第四个乘号的位置p4在p3+1--第8元素前(循环)
{p4前的元素拼合为第四个整数
  p4前的元素拼合为第五个整数
  五个整数的乘积记为product
  若product>max
  {max<=product
   并记录五个整数
   }




输出max和记录的五个整数

#3


从八个位置里选四个,然后分别计算取最大的,这个还不简单?这是最笨的方法,也是唯一的方法,这种问题除了遍历没有其他的方法!

#4


2楼的办法复杂度比较低,但正不正确不敢下结论。

#5


我目前想到的也只有穷举
坐等牛人

#6


再牛也只能穷举,充其量在穷举的基础上优化一下。
引用 5 楼  的回复:
我目前想到的也只有穷举
坐等牛人

#7


也感觉只能穷举,期待更好的解答

#8


简单啊,9位数分成5份,将9位数依大至小排列,取前5位数为首进行分割即可。

#9


#8 如何证明上述方案为最大?

#10


引用
#8 如何证明上述方案为最大?

不知楼上对基础数论是否了解?证明起来就比较啰嗦,估计这里没多少人有兴趣,不过,你可以任意找些数验证一下。

#11


大哥,人家是“在一个9位数的正整数n中插入4个乘号”,9位数字的排列顺序不能改变。
引用 8 楼  的回复:
简单啊,9位数分成5份,将9位数依大至小排列,取前5位数为首进行分割即可。

#12


就算不是插入,你的算法显然也不对,如果9位数中有一个0,那么你的算法结果就为0,显然0不是最大的!

#13


8楼的方法看起来不错。

#14


就算没有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,也是不对的

#15


只拿原题目中的数据做测试。
/*******************************************
1. 编程实现在一个9位数的正整数n中插入4个乘号,使分得的5个整数的乘积最大;

2. 输入 n

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

4. 例如:输入 734019862
  输出 73*401*9*8*62=130674672
 
**********************************************/ 
#include 
#include 
int getInteger( int a[], int start, int last)
{
    int k;
    int product=a[start];
    for( k=start+1; 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;
}

#16


先排除0和1?

#17


找出9个数中最大的5个数,作为5个数的首位将九位数截断

#18


那个只是首位估算,首位相同的话,那就只能在估算次位了,那就比较麻烦了,但应该比穷举好一点吧

#19


引用 18 楼  的回复:
那个只是首位估算,首位相同的话,那就只能在估算次位了,那就比较麻烦了,但应该比穷举好一点吧

无重复数字时,可以。但重复时要复杂了,例如
2222分成两个数
2*222=444
22*22=484
是穷举比较还是找一个选取规则?

#20


正如楼上诸位所述,穷举次数只有70次(8!/4!/(8-4)!),代价不大了。也许设计一个生成nextCombination()函数能使程序结构更好些。

#21


457869032 => 9 8 7 6 5 4 3 2 0  => 45 *7 *8 *6 *9032 = 136563840

#22


同数加权问题,3,2,1小数问题,按数论的规律,合并数比乘积数要大,111111111=> 11111*1*1*1*1 << 11*11*11*111;即逢0、1、2、3尽可能的合并

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了C++中的引用运算符及其应用。引用运算符是一种将变量定义为另一个变量的引用变量的方式,在改变其中一个变量时,两者均会同步变化。引用变量来源于数学,在计算机语言中用于储存计算结果或表示值抽象概念。变量可以通过变量名访问,在指令式语言中引用变量通常是可变的,但在纯函数式语言中可能是不可变的。本文还介绍了引用变量的示例及验证,以及引用变量在函数形参中的应用。当定义的函数使用引用型形参时,函数调用时形参的改变会同时带来实参的改变。 ... [详细]
author-avatar
Hongquan_Yang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有