鱼C论坛

 找回密码
 立即注册
查看: 4680|回复: 9

[已解决]最大乘积问题

[复制链接]
发表于 2022-11-2 23:47:40 | 显示全部楼层 |阅读模式
50鱼币
应用循环,数组, 求帮助。
最佳答案
2022-11-2 23:47:41
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int c , d , i , n , s        ;
  5.         scanf("%d" , & n)            ;
  6.         for(c = i = 0 , s = 1 ; i < n ; i ++) {
  7.                 scanf("%d" , & d) ;
  8.                 if(d > 0) {
  9.                         s *= d       ;
  10.                         c ++         ;
  11.                 }
  12.         }
  13.         if(c > 1) printf("%d\n" , s) ;
  14.         else printf("-1\n")          ;
  15. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 5
  4. 2 5 -1 2 -1
  5. 20

  6. D:\[00.Exerciese.2022]\C>
复制代码
屏幕截图 2022-11-02 234624.png
屏幕截图 2022-11-02 234609.png

最佳答案

查看完整内容

编译、运行实况:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-2 23:47:41 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int c , d , i , n , s        ;
  5.         scanf("%d" , & n)            ;
  6.         for(c = i = 0 , s = 1 ; i < n ; i ++) {
  7.                 scanf("%d" , & d) ;
  8.                 if(d > 0) {
  9.                         s *= d       ;
  10.                         c ++         ;
  11.                 }
  12.         }
  13.         if(c > 1) printf("%d\n" , s) ;
  14.         else printf("-1\n")          ;
  15. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 5
  4. 2 5 -1 2 -1
  5. 20

  6. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 00:17:26 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>


  3. int main()
  4. {
  5.         int max=-1, n, i,j,k, temp;
  6.         scanf("%d", &n);
  7.         int a[n];
  8.         for (i=0; i<n; i++)
  9.                 scanf("%d", &a[i]);
  10.                
  11.         for (i=0; i<n; i++){  //从0开始取子序列
  12.                 for (j=1; j<=n-i; j++){  //子序列的长度
  13.                         temp = 1;  //计算每组序列的乘积,与max比较取最大
  14.                         for (k=0; k<j; k++){
  15.                                 temp *= a[i+k];
  16.                         }
  17.                         if (temp>max){
  18.                                 max = temp;
  19.                         }
  20.                 }
  21.         }
  22.         printf("%d", max);
  23.        
  24.         return 0;
  25. }

复制代码

评分

参与人数 1鱼币 +2 收起 理由
hamletroy + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 17:16:15 | 显示全部楼层
  1. #include <stdio.h>
  2. #define ll long long
  3. int main()
  4. {
  5.         int n;
  6.         scanf("%d", &n);
  7.         ll numbers[n];
  8.         ll qzj[n];
  9.         ll pos[n], neg[n];
  10.         int len1 = 0, len2 = 0;
  11.        
  12.         for(int i=0; i<n; ++i) {
  13.                 scanf("%lld", &numbers[i]);
  14.                 if(i == 0) qzj[i] = numbers[i];
  15.                 else qzj[i] = qzj[i-1] * numbers[i];
  16.                 if(qzj[i] > 0) pos[len1++] = qzj[i];
  17.                 else if(qzj[i] < 0) neg[len2++] = -qzj[i];
  18.                 else break;
  19.         }
  20.        
  21.         ll min_ = pos[0];
  22.         ll pos_max = pos[len1-1];
  23.         for(int i=1; i<len1; ++i) {
  24.                 ll temp = pos[i] / min_;
  25.                 pos_max = (temp > pos_max ? temp : pos_max);
  26.                 min_ =    (pos[i] < min_ ? pos[i] : min_);
  27.         }
  28.        
  29.         min_ = neg[0];
  30.         ll neg_max = neg[len2-1];
  31.         for(int i=1; i<len2; ++i) {
  32.                 ll temp = neg[i] / min_;
  33.                 neg_max = (temp > neg_max ? temp : neg_max);
  34.                 min_ =    (neg[i] < min_ ? pos[i] : min_);
  35.         }
  36.        
  37.         if(len1 == 1 && len2 == 1) printf("-1");
  38.         else printf("%lld", (pos_max > neg_max ? pos_max : neg_max));
  39.         return 0;
  40. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +1 收起 理由
hamletroy + 5 + 5 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 19:11:38 | 显示全部楼层
楼上正解~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 19:16:20 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-11-3 19:17 编辑

因为大于零的数如果你选了,结果不会变差,只会变好,如果不选,他就不是最大乘积了,很基础的,一个循环,甚至不需要数组就可以搞定
  1. #include <stdio.h>

  2. int main() {
  3.         int n, cnt = 0, a[100001];
  4.         unsigned long long res = 1;
  5.         scanf("%d", &n);
  6.         for (int i = 1; i <= n; ++i)
  7.                 scanf("%d", &a[i]);
  8.         for (int i = 1; i <= n; ++i) {
  9.                 if (a[i] >= 1) {
  10.                         res *= a[i];
  11.                         ++cnt;
  12.                 }
  13.         }
  14.         if (cnt) printf("%llu", res);
  15.         else printf("-1");
  16.         return 0;
  17. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
hamletroy + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-3 19:36:32 | 显示全部楼层
#include<stdio.h>

int _max(int a, int b)
{
    return a > b ? a : b;
}

int a[20];
int f[20][20];

int main()
{
    int n, i, j, s = 0;
    scanf("%d", &n);
    for(i = 0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(j = 1;j<n;j++)
    {
        f[0][0] = a[0];f[0][j] = f[0][j-1]*a[j];
    }
    for(i = 1;i<n;i++)
    {
        f[i][i-1] = 1;
        for(j = i;j < i; j++)
        {
            f[i][j] = f[i][j-1]*a[j];
        }
    }
        for(i = 0;i<n;i++)
        {
            for(j = i;j<n;j++)
            {
                s = _max(s,f[i][j]);
            }
        }
                if(s == 0)
                {
                    printf("-1\n");
                }
                else
                {               
                    printf("%d\n",s);
                }
        return 0;
}

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 19:39:40 | 显示全部楼层
hamletroy 发表于 2022-11-3 19:36
#include

int _max(int a, int b)

我没理解题意吗?为什么这么做?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 19:41:16 | 显示全部楼层
要开long long !因为10^18会爆int!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 19:41:51 | 显示全部楼层
jackz007 发表于 2022-11-2 23:47
编译、运行实况:

s 要开 long long !因为10^18会爆int!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 08:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表