欧拉计划--C++编程突破6

欧拉计划–C++编程突破6

欧拉计划:https://projecteuler.net/problem=11

在进入正篇之前得对之前的内容进行解释,为什么是C++编程突破,而写的却是C的代码。

是这样,首先本身C的代码也可以认为是C++代码的一种,但是本博客攥写目的在于学习算法思维,其实想改成C++非常容易(真的),但是基于以前刷题使用的就是C语言,所以没有更改,望读者周知。

Problem 11
In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?

问题11
在下面的20×20格中,沿着一条对角线的四个数字已经用红色标出。
这些数字的乘积是26×63×78×14=1788696。
在20×20格中,四个相邻数在同一方向(上,下,左,右或对角)的最大乘积是多少?

在这里插入图片描述

解题思路:要找某个方向上的最大乘积,就要选定方向,此时我们使用方向数组控制我们寻找的方向,每次寻找判断大小即可

#include<stdio.h>
#define max_n 20

int grid[max_n + 5][max_n + 5];
int dir[4][2] = {{0,1}, {1,1}, {1,0}, {1,-1}}; //方向数组

int calc(int x, int y) { //计算最大值
    int ans;
    for (int k = 0;k < 4; k++) {
        int p = 1;
        for (int step = 0; step < 4; step++) { //寻找方向上的四个数字。
            int dx = x + step * dir[k][0];
            int dy = y + step * dir[k][1];
            if(dx < 0 || dx >= max_n) break;
            if(dy < 0 || dy >= max_n) break;
            p *= grid[dx][dy];
        }
        if (p > ans) ans = p;
    }
    return ans;
}

int main() {
    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n; j++) {
            scanf("%d", &grid[i][j]);
        }
    }
    int ans = 0;
    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n ; j++) {
            int p = calc(i,j);
            if (p > ans) ans = p;
        }
    }
    printf("%d",ans);
    return 0;
}

验证answer = 70600674

Problem 12

The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …
Let us list the factors of the first seven triangle numbers:
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
We can see that 28 is the first triangle number to have over five divisors.
What is the value of the first triangle number to have over five hundred divisors?

问题12
通过添加自然数生成三角形数的序列。 所以第7个三角形的数是1+2+3+4+5+6+7=28。 前十个条件是:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …
让我们列出前七个三角形数的因数:
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
我们可以看到,28是第一个有超过五个约数的三角形数。
超过五百个除数的第一个三角形数的值是多少?

解题思路:这道题有些复杂,需要首先了解约数个数的知识,一个正整数可以分解为若干个质因子一定幂次的乘积,在了解这点以后还需要知道约数个数即所有素因子的幂次的乘积。且如果这个数分解成两个之后,约数个数等于两个数约数个数的乘积。(证明自寻),在之后确定三角形数的通项公式,进而可以确定约数个数从而得到答案,这道题的重难点在于求质因子和几条规律的发现和编写。

#include<stdio.h>
#define max_n 100000

int prime[max_n + 5] = {0};
int f[max_n + 5] = {0};
int cnt[max_n + 5] = {0};

void init() {
    for (int i = 2; i <= max_n; i++) {
        if (!prime[i]) {
            prime[++prime[0]] = i;
            f[i] = 2; //记录能整除i的最小素数。
            cnt[i] = 1;  //记录素因子个数
        }
        for (int j = 1; j <= prime[0]; j++) {
            if (prime[j] * i > max_n) break;
            prime[prime[j] * i] = 1;
            if (i % prime[j] == 0) {
                f[prime[j] * i] = f[i] / (cnt[i] + 1) * (cnt[i] + 2);
                cnt[prime[j] * i] = cnt[i] + 1;
                break;
            } else {
                f[prime[j] * i] = f[prime[j]] * f[i];
                cnt[prime[j] * i] = 1;
            }
        }
    }
    return ;
}

int main() {
    init();
    long long  f_max = 0,n = 1;
    while (1) {
        if (n & 1) {
            f_max = f[n] * f[(n + 1) >> 1];
        } else {
            f_max = f[n >> 1] * f[n + 1];
        }
        if (f_max > 500) break;
        n += 1;
    }
    printf("%lld\n",n * (n + 1) / 2);
    return 0;
}

验证answer = 76576500

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值