鱼C论坛

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

[已解决]最大乘积问题

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

int main(void)
{
        int c , d , i , n , s        ;
        scanf("%d" , & n)            ;
        for(c = i = 0 , s = 1 ; i < n ; i ++) {
                scanf("%d" , & d) ;
                if(d > 0) {
                        s *= d       ;
                        c ++         ;
                }
        }
        if(c > 1) printf("%d\n" , s) ;
        else printf("-1\n")          ; 
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

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

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

最佳答案

查看完整内容

编译、运行实况:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

int main(void)
{
        int c , d , i , n , s        ;
        scanf("%d" , & n)            ;
        for(c = i = 0 , s = 1 ; i < n ; i ++) {
                scanf("%d" , & d) ;
                if(d > 0) {
                        s *= d       ;
                        c ++         ;
                }
        }
        if(c > 1) printf("%d\n" , s) ;
        else printf("-1\n")          ; 
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

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

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


int main()
{
        int max=-1, n, i,j,k, temp;
        scanf("%d", &n);
        int a[n];
        for (i=0; i<n; i++)
                scanf("%d", &a[i]);
                
        for (i=0; i<n; i++){  //从0开始取子序列 
                for (j=1; j<=n-i; j++){  //子序列的长度 
                        temp = 1;  //计算每组序列的乘积,与max比较取最大 
                        for (k=0; k<j; k++){
                                temp *= a[i+k];
                        }
                        if (temp>max){
                                max = temp;
                        }
                }
        }
        printf("%d", max);
        
        return 0;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 17:16:15 | 显示全部楼层
#include <stdio.h>
#define ll long long
int main()
{
        int n;
        scanf("%d", &n);
        ll numbers[n];
        ll qzj[n];
        ll pos[n], neg[n];
        int len1 = 0, len2 = 0;
        
        for(int i=0; i<n; ++i) {
                scanf("%lld", &numbers[i]);
                if(i == 0) qzj[i] = numbers[i];
                else qzj[i] = qzj[i-1] * numbers[i];
                if(qzj[i] > 0) pos[len1++] = qzj[i];
                else if(qzj[i] < 0) neg[len2++] = -qzj[i];
                else break;
        }
        
        ll min_ = pos[0];
        ll pos_max = pos[len1-1];
        for(int i=1; i<len1; ++i) {
                ll temp = pos[i] / min_;
                pos_max = (temp > pos_max ? temp : pos_max);
                min_ =    (pos[i] < min_ ? pos[i] : min_);
        }
        
        min_ = neg[0];
        ll neg_max = neg[len2-1];
        for(int i=1; i<len2; ++i) {
                ll temp = neg[i] / min_;
                neg_max = (temp > neg_max ? temp : neg_max);
                min_ =    (neg[i] < min_ ? pos[i] : min_);
        }
        
        if(len1 == 1 && len2 == 1) printf("-1");
        else printf("%lld", (pos_max > neg_max ? pos_max : neg_max));
        return 0;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 19:11:38 | 显示全部楼层
楼上正解~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

int main() {
        int n, cnt = 0, a[100001];
        unsigned long long res = 1;
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i)
                scanf("%d", &a[i]);
        for (int i = 1; i <= n; ++i) {
                if (a[i] >= 1) {
                        res *= a[i];
                        ++cnt;
                }
        }
        if (cnt) printf("%llu", res);
        else printf("-1");
        return 0;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

int _max(int a, int b)

我没理解题意吗?为什么这么做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-3 19:41:16 | 显示全部楼层
要开long long !因为10^18会爆int!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

s 要开 long long !因为10^18会爆int!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 08:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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