减少执行时间C ++

时间:2017-11-13 18:16:36

标签: linux performance c++11 optimization

任务

您在书中获得了一定数量的页面。书籍打印机是懒惰的,只会在每隔一页打印一个侧面编号。要打印的第一页编号是1.任务是计算在打印的书页上使用特定编号的次数。目标是打印出书页中使用的所有数字; 10 ^ 9<页面<不到5秒内10 ^ 12。

例如

书页数量为20.要打印的书页为1,3,5,7,9,11,13,15,17和19. 1仅包含数字1,仅供参考逐个增加节省。但是,数字13包含1和3,因此节省的数字1和3将增加,等等。

问题

如何让程序在更大的数字下执行得更快?我一直在考虑使用线程,但我不确定它是否有用。

#include <iostream>
#include <string>

int main(int argc, char *argv[]) {

    long long sideNumber;
    long long numbers[10];

    if(argv[1]) {
        sideNumber = std::stoll(argv[1]);
    } else {
        std::printf("Please enter amount of pages.\n");
        return -1;
    }

    for(int i = 0; i < 10; i++) numbers[i] = 0;

    long long index = 1;

    while(index < sideNumber) {
        long long current = index;
        while(current > 0) {
            numbers[current%10]++;
            current /= 10;
        }
        index += 2;
    }

    for(int i = 0; i < 10; i++) {
        std::printf("%i : %i\n", i, numbers[i]);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是一个数学问题,而不是计算问题。 但是,如果这确实被设置为计算问题,那么答案可能是递归的。

考虑页码1-9。他们为0-9的数字计算了多少?

现在考虑第11-19页。您可以重复使用上一个任务中的计数来制作新的计数器吗?再次为2x,3x,4x等

那么,您可以重复使用1-99的计数器来进行101-199?等等。

请注意,您需要更多地考虑如何处理中间零。

或者,您可以使用铅笔在编写程序所用时间的一半时间内获得相同的结果。