我有两个变量i,j在运行时都是未知的。我有两个极限maximumi和maximumj,它们的值已知,使得i在0和它各自的极限之间(对于j来说是相同的)。我有另一个变量,它在运行时是已知的,是i和j的总和。在使用i和j执行某个计算之前,我需要找到具有等于变量sum的和的i和j的所有值。我试过的是使用一个嵌套for循环并简单地用暴力强制我找到i和j的值,这样每次可能我添加每个可能的j并检查总和是否等于sum。这适用于小范围,但随着我的限制接近无穷大,算法变得非常容易。我有3秒的阈值来找到这些数字。我的情况是否有推荐的数据结构。
答案 0 :(得分:4)
var sum = 99999999;
var max = 60000000;
var min = 10000000;
var i = max;
var j = sum - max;
var result = new List<Tuple<int, int>>();
while (j >= min && j =< max)
{
result.Add(new Tuple<int, int>(i, j));
i--;
j++;
}
无需暴力,因为这可以轻松计算。即使在最大值和最小值之间存在较大间隙,也能在几毫秒内平稳运行。
答案 1 :(得分:2)
您只需要一个循环(例如i
从0
到sum
),j
将始终等于sum - i
。无需为j
创建嵌套循环,因为它的值始终是已知的。
int sum = 1337;
for (int i = 0; i <= sum; i++)
{
var j = sum - i;
Console.WriteLine("{0} + {1} = {2}", i, j, sum);
}
答案 2 :(得分:1)
你可以简单地枚举一下吗?
List<Tuple<int, int>> options = new List<Tuple<int, int>();
for(int a=0; a < sum; a++)
options.Add(new Tuple<int, int>(a, sum-a));
当然,调整你的界限。
答案 3 :(得分:1)
int min( int a, int b ){ return a < b ? a : b; }
int max( int a, int b ){ return a > b ? a : b; }
void pairs( int sum, int maxi, int maxj ){
if( maxi + maxj < sum ) return;
maxi = min( maxi, sum );
maxj = min( maxj, sum );
for( int i = max( 0, sum - maxj); i <= min( maxi, sum ); i++ ){
std::cout << "i=" << i << ", j=" << (sum - i) << std::endl;
}
}