c++ - 我的程序太慢了
问题描述
我是编程初学者,我正在学习一门 C++ 语言。
我必须创建一个程序,首先加载一定数量的数字,然后再加载数字。如果它们不是 2 的幂,我需要得到一个一个一个相加的结果,否则我需要减去这个数字。
例如:对于 3,结果是 = -1 - 2 + 3 = 0(1 和 2 是 2 的幂)对于 4,结果是 = -1 - 2 + 3 - 4 = -4
听起来这不是问题,但是程序必须转换为结果的最大值是 1 000 000 000。它必须在 3 秒内给出结果。
我在下面粘贴我的代码。请帮助我在短时间内转换大量数字的能力。
#include <iostream>
using namespace std;
int main()
{
long long amount, number, i = 0, a, b, result = 0;
cin >> amount;
while (i < amount) {
cin >> number;
if (number < 100000000) {
a = 1;
result = 0;
} else if (100000000 <= number) {
a = 100000001;
result = 4999999791564546;
}
while (a <= number) {
b = a;
while (b % 2 == 0 && b > 1) {
b = b / 2;
}
if (b == 1) {
result = result - a;
} else {
result = result + a;
}
a++;
}
cout << result << endl;
i++;
}
}
解决方案
所有学分都归昆汀所有。我提出了同样的想法,但昆汀首先提到了,所以所有的功劳都归他所有。
在所有这些竞争激烈的编程挑战中,您会看到大量数字和时间限制,“蛮力”或“循环遍历所有内容”肯定不会产生预期的结果。
一个好的算法总是更好的解决方案。
所以查看任务,我们需要添加除一些之外的所有值。这意味着,解决方案的第一步是添加所有值,然后减去“一些不需要的”值(2 的幂)。中间结果是所有“想要的”值的总和。
还需要添加所有不需要的值(2 的幂)。
最终结果是中间结果减去 2 的幂的总和。或者,正如任务描述中用混淆的词所述:“所有值的总和”-“2 的幂和”-“2 的幂和” .
因此,作为第 1 步,我们需要计算所有值的总和。这是一个众所周知的算法。你到处都可以找到。值 6 的简短说明:
123456
654321
------
777777
因此,我们在一行中写入值的序列,在下一行中写入相反的序列。最后一行总结了单个数字。而且,我们将很容易看到这种模式:n * (n+1) / 2
2 的幂和类似简单。在二进制数系统中,2 的幂是一个只有一个设置位的值:
1 = 0001
2 = 0010
4 = 0100
8 = 1000
---------
Sum: 1111
总和是所有位都设置的值。通过一些简单的摆弄,我们可以很容易地找到解决方案。
请在下面查看完整的工作解决方案。请注意:它会非常快,输入值对计算时间几乎没有影响。
#include <iostream>
#include <algorithm>
constexpr unsigned long MaxSource = 1000000000UL;
int main()
{
// Get the Base value from the user
std::cout << "Enter a number (1..1000000000):\n";
unsigned long sourceNumber {0};
std::cin >> sourceNumber;
// Limit input value
sourceNumber = std::clamp (sourceNumber, 1UL, MaxSource);
// calculate the sum of all values in the range 1..sourceNumber
const long long t1 {static_cast<long long>(sourceNumber)};
const long long t2 {t1+1};
const long long sum1 { (t1 * t2) >> 1 };
// Now calculate the sum of all powers of 2
long long sum2 {0x00000000'FFFFFFFF};
long long bitTestMask {0x00000000'80000000};
// find the highest set bit
while (0 == (t1 & bitTestMask)) {
bitTestMask = bitTestMask >> 1;
sum2 = sum2 >> 1;
}
std::cout << "Result: " << sum1 - sum2 - sum2 << "\n";
return 0;
}
我省略了典型的竞争性程序多个测试用例的东西。
可惜没有人会读到这个。. .
推荐阅读
- javascript - 映射到饼图 - Amcharts
- python - 如何修复windows10中python中的多处理问题
- java - 从 gmail 收件箱中检索特定主题的邮件
- excel - VBA:使用“查找”获取值的行/修复对象变量错误
- sql - 显示超过 3 个工作日的工作
- c# - 我无法在 C# 中为我的 Unity 游戏编写赢得关卡的脚本。我需要帮助
- javascript - 从 morris.js 折线图中删除中间多余的 x 轴线
- jquery - 如何更改字体真棒图标和按钮类 onclick?
- sql - SQL teradata - 正则表达式数字
- ubuntu - Ubuntu crontab 没有一直运行