Project_Euler-08 题解

Project_Euler-08 题解

标题

题目

图片1
图片2
图片3
图片4
图片5
图片6

题目中给出的数据如下:

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450

存在空格,不存在换行符

思路

题目要求求出连续 13 13 13 个数的最大乘积,因此要求我们维护一个包含 n n n 个元素的窗口(这里的 n n n 13 13 13),从头向后扫描,每次记录下每个窗口的积,再维护一个最大值,每次比较大小取大者。

本文的代码使用了一种自定义 n n n 值的方式,但是仍然不能让 n n n 值过大,否则 l o n g l o n g longlong longlong 类型也承载不下,使用getchar作为读入文本的方式。

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define ll long long
#define MAX_N 10000

char a[MAX_N];

ll solve(int n) {
    int len = 1;
    char t;
    while((t = getchar()) != EOF) {
        if (t == '\n' || t == '\0') continue;
        if (t <= '9' && t >= '0') a[len++] = t;
        else continue;
    }
    printf("len = %d\n", len - 1);

    int l = 1, r = 0;
    ll ans = 0, temp = 1;
    while(r < len) {
        ++r;
        if (a[r] == '0') {
            temp = 1;
            l = r + 1;
            continue;
        } else temp *= (a[r] - '0');
        printf("a[r] = %d, ans = %lld, temp = %lld\n", a[r] - '0', ans, temp);
        if (r - l >= n) {
            temp /= (a[l++] - '0');
        }
        if (ans < temp) ans = temp;
    }
    return ans;
}

int main() {
    ll ans;
    int len, n;
    scanf("%d", &n);
    ans = solve(n);
    printf("%lld\n", ans);
    return 0;
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若亦_Royi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值