您在书中获得了一定数量的页面。书籍打印机是懒惰的,只会在每隔一页打印一个侧面编号。要打印的第一页编号是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;
}
答案 0 :(得分:0)
这是一个数学问题,而不是计算问题。 但是,如果这确实被设置为计算问题,那么答案可能是递归的。
考虑页码1-9。他们为0-9的数字计算了多少?
现在考虑第11-19页。您可以重复使用上一个任务中的计数来制作新的计数器吗?再次为2x,3x,4x等
那么,您可以重复使用1-99的计数器来进行101-199?等等。
请注意,您需要更多地考虑如何处理中间零。
或者,您可以使用铅笔在编写程序所用时间的一半时间内获得相同的结果。