乘积最大

原题:

设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积最大。同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:有一个数字串:312, 当N=3,K=1时会有以下两种分法:1)312=362)312=62这时,符合题目要求的结果是:31*2=62。现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
【输入】第一行共有2个自然数N,K(6≤N≤10,1≤K≤6)第二行是一个长度为N的数字串。【输出】输出所求得的最大乘积(一个自然数)。
【输入样例】
4 2
1231
【输出样例】
62


作者:海洋之心-烈焰甜心
来源:优快云
原文:https://blog.youkuaiyun.com/qq_38060122/article/details/79255198
版权声明:本文为博主原创文章,转载请附上博文链接!

下面是我的代码:

#include<stdio.h>
#include<math.h> 
int chengji(char *p,int s1)
{
 int i=0,count=0,s,s2=0;char *q;
 while(1)
 {
  if(p[i]=='*'||p[i]=='\0') break;
  else
  {
   count++;
      i++;
  } 
 }
 i=0;
 while(1)
 {
  if(p[i]=='*'||p[i]=='\0') break;
  else 
  {
   s2+=(p[i]-'0')*pow(10,--count);
      i++;
  }
 }
 if(p[i]=='\0')
 {
  s=s1*s2;
  return s;
  } 
 else
 {
  s1=s1*s2;
  q=&p[i+1];
  chengji(q,s1);
 }
}
int charu(int i,char *a,int n)
{
 int j;
 for(j=n+1;j>=i+1;j--)
 {
  a[j]=a[j-1];
 }
 a[i]='*';
 n++;
 return n; 
}
int shanchu(char *a,int n)
{
 int i,j;i=n-1;
 while(a[i]!='*')
 {
  i--;
 }
 for(j=i;j<=n-1;j++)
 {
  a[j]=a[j+1];
 }
 n--;
 return n;
}
main()
{
 int i,j1,j2,j3,j4,v=0,n,k,m1,m2,m3,m4,m5,s[100],max;char a[100];
 scanf("%d %d",&n,&k);
 getchar();
 scanf("%s",a);
 if(k==1)
 {
  for(i=1;i<=n-1;i++)
  {
   m1=charu(i,a,n);
   s[v++]=chengji(a,1);
   n=shanchu(a,m1);
  }
 }
 else if(k==2)
 {
  for(i=1;i<=n-2;i++)
  {
      m1=charu(i,a,n); 
   for(j1=i+2;j1<=m1-1;j1++)
   {
    m2=charu(j1,a,m1);
    s[v++]=chengji(a,1);
    m1=shanchu(a,m2);
   }
   n=shanchu(a,m1);
  }
 }
 else if(k==3)
 {
  for(i=1;i<=n-3;i++)
  {
   m1=charu(i,a,n);
   for(j1=i+2;j1<=m1-2;j1++)
   {
    m2=charu(j1,a,m1);
    for(j2=j1+2;j2<=m2-1;j2++)
    {
     m3=charu(j2,a,m2);
     s[v++]=chengji(a,1);
     m2=shanchu(a,m3);
    }
    m1=shanchu(a,m2);
   }
   n=shanchu(a,m1);
  }
 }
 else if(k==4)
 {
  for(i=1;i<=n-4;i++)
  {
   m1=charu(i,a,n);
   for(j1=i+2;j1<=m1-3;j1++)
   {
    m2=charu(j1,a,m1);
    for(j2=j1+2;j2<=m2-2;j2++)
    {
     m3=charu(j2,a,m2);
     for(j3=j2+2;j3<=m3-1;j3++)
     {
      m4=charu(j3,a,m3);
      s[v++]=chengji(a,1);
      m3=shanchu(a,m4);
     }
     m2=shanchu(a,m3);
    }
    m1=shanchu(a,m2);
   }
   n=shanchu(a,m1);
  }
 }
 else if(k==5)
 {
  for(i=1;i<=n-5;i++)
  {
   m1=charu(i,a,n);
   for(j1=i+2;j1<=m1-4;j1++)
   {
    m2=charu(j1,a,m1);
    for(j2=j1+2;j2<=m2-3;j2++)
    {
     m3=charu(j2,a,m2);
     for(j3=j2+2;j3<=m3-2;j3++)
     {
      m4=charu(j3,a,m3);
      for(j4=j3+2;j4<=m4-1;j4++)
      {
       m5=charu(j4,a,m4);
       s[v++]=chengji(a,1);
       m4=shanchu(a,m5);
      }
      m3=shanchu(a,m4);
     }
     m2=shanchu(a,m3);
    }
    m1=shanchu(a,m2);
   }
   n=shanchu(a,m1);
  }
 }
 max=s[0];
 for(i=0;i<v;i++)
 {
  if(max<s[i]) max=s[i];
 }
 printf("%d",max);
}

完全自创的哦!需要大家仔细理解,这里我就不说的你那么具体啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值