欧拉计划--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

AutoCAD的最新版本是AutoCAD2014,它于2013年3月28日发布了免费试用版。AutoCAD2014相比于之前的版本增加了许多实用功能,例如支持Win8触屏操作、增强的命令行功能以及图形选项卡功能等。你可以通过以下链接下载AutoCAD2014免费试用版:[链接1](https://pan.baidu.com/s/1Nd-sI15jyYGYaFWm7FNmfw)和[链接2](https://pan.baidu.com/s/1MNY-Ob4FVAV-0pV_BdRNpg)。下载完成后,按照以下步骤进行安装: 1. 鼠标右键单击下载好的AutoCAD2014的压缩包,选择解压到当前文件夹,等待解压完成,并双击进入新解压出来的文件夹内。 2. 双击打开AutoCAD2014的安装程序Setup。 3. 点击安装产品。 4. 勾选需要安装的产品内容,点击下一步。 5. 勾选我接受,点击下一步。 6. 输入AutoCAD2014的序列号和秘钥,然后点击下一步。 7. 点击配置。 8. 勾选单机许可,点击下一步。 9. 点击浏览,选择安装路径,最好选择一个非系统盘的路径,然后点击下一步。 10. 点击下一步。 11. 点击配置完成。 12. 点击安装,等待所有程序安装完成,大约需要10分钟。 13. 取消已经勾选的两个查看,点击完成。 14. 桌面双击AutoCAD2014的软件图标,双击打开进入激活界面,点击激活。 15. 选择第二个选项,即已有激活码。 16. 找到下载好的注册机压缩包,解压并进入文件夹内。 17. 以管理员身份运行注册机。 18. 复制申请号,粘贴至注册机第一行,删除之前的英文字符,只保留申请号。点击Mem Patch,出现提示框后点击确定。 19. 点击Generate,在注册机第二行会生成激活码,复制并粘贴至激活界面的相应方框内,点击下一步。 20. AutoCAD2014已成功激活,点击完成。 21. 现在你可以永久使用AutoCAD2014了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值