繁体   English   中英

我遇到了 Project Euler #8 的问题

[英]I'm having problems with Project Euler #8

这是我的 Project Euler #8 代码。 它通过读取每个字符从文件中读取 1000 位数字,然后将其转换为整数,然后再将其存储到数组中。 然后我打算使用循环来读取 13 位数字、0-12、1-13、2-14 等的分组。并将它们相乘。 如果结果大于前一个最大的,则将其存储到 num2 中。

#include <iostream>
#include <fstream>

using namespace std;

int num1=1, num2;

int main(){

    int digitArray[1000];
    char ctemp;
    int itemp;

    ifstream myfile;
    myfile.open("1000 digit number.txt");
    if(myfile.is_open()){
        for(int i=0; i < 1000; i++){
            myfile >> ctemp;
            itemp = ctemp - '0';
            digitArray[i] = itemp;
        }
    }
    myfile.close();

    for(int i = 0; i < 1000; i++){
        int j = i;
        while(j != (i+13)){
            num1 *= digitArray[j];
            j++;
            if(j == 1000){
                break;
            }
        }
        if(num1 > num2){
            num2 = num1;
        } else {}
    }

    cout << num2 << endl;

    return 0;

}

此代码输出值 5000940,这不是正确答案。 帮助?

num1不会为每 13 个连续数字初始化为 1。 还要在访问任何越界索引之前检查break条件。

 for(int i = 0; i < 1000; i++){
        int j = i;
        num1=1;
        while(j != (i+13)){
            if(j == 1000){
                break;
            }
            num1 *= digitArray[j];
            j++;
            
        }
        if(num1 > num2){
            num2 = num1;
        } 
    }

简化我想出的算法:

#include <iostream>
#include <string>
#include <cstdint>

int main(){
    std::string input;
    // std::cin >> input;
    input = "1101111111111133111111111111122";
    uint64_t prod = 1;
    uint64_t m = 0;
    size_t count = 0;
    for (auto p = input.begin(); p != input.end(); ++p) {
        prod *= *p - '0';
        if (prod == 0) {
            prod = 1;
            count = 0;
        } else {
            if (count++ >= 13) {
                prod /= *(p - 13) - '0';
            }
            if ((count >= 13) && (prod > m)) m = prod;
        }
    }
    std::cout << "max = " << m << std::endl;
}

该方法使用滑动窗口逐位更新产品。 它以 0 的窗口大小开始并在此之前将其增长到 13,并且每次看到'0'时,窗口大小都会重置为再次增长。

这是有效的:

#include <iostream>
#include <fstream>

using namespace std;

int main(){

    int digitArray[1000];
    char ctemp;
    int itemp;

    ifstream myfile;
    myfile.open("1000 digit number.txt");
    if(myfile.is_open()){
        for(int i=0; i < 1000; i++){
            myfile >> ctemp;
            itemp = ctemp - '0';
            digitArray[i] = itemp;
        }
    }
    myfile.close();

    long num2; 

    for(int i = 0; i < 1000; i++){
        int j = i;
        long num1 = 1;
        while(j != (i+13)){
            if(j == 1000){
                break;
            }
            num1 *= digitArray[j];
            j++;
        }
        cout << endl;
        if(num1 > num2){
            num2 = num1;
        } else {}
    }

    cout << num2 << endl;

    return 0;

}

需要使 num2 长,移动分解,并在 for 循环内部而不是外部初始化 num1。 老实说,没想到需要这么大的价值。 尴尬,但不管怎样。 谢谢您的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM