110,539
社区成员
发帖
与我相关
我的任务
分享
//精彩!!!!!
//找出少的那个数
if (remain > 0)
FirstA = Math.Min(FirstA + increaseA, FirstB + increaseB);
======>
//找出少的那个数
if (remain == 1)
FirstA = Math.Min(FirstA + increaseA, FirstB + increaseB);
else if (remain == 2)
FirstA = Math.Max(FirstA + increaseA, FirstB + increaseB);
static double getItem(long A, long B, long N)
{
//计算初始值
long startA = A - B;
long startB = A + B;
//计算递增
long increaseA = startA << 1;
long increaseB = startB << 1;
//求最大公约数,计算循环节长度
long maxcd = maxCommonDivisor(increaseA, increaseB);
long looplength = increaseA / maxcd + increaseB / maxcd;
//计算第一个循环的位置
long firstLoop = looplength >> 1;
//如果循环节长度为奇数,则不会重复
if ((looplength & 1) == 0 && N > firstLoop)
{
//根据循环节长度推算本来的N值(不删除元素的情况下)
long increase = (N - firstLoop) / (looplength - 1) + 1;
N += increase;
}
//计算对应A数组的位置和B数组的位置,及对应的值
long IndexA = (N * startB / A) >> 1;
long FirstA = IndexA * increaseA - startA;
long IndexB = (FirstA + startB) / increaseB;
long FirstB = IndexB * increaseB - startB;
//由于取整的缘故,可能会少1个数
long remain = N - IndexA - IndexB;
//找出少的那个数
if (remain > 0)
FirstA = Math.Min(FirstA + increaseA, FirstB + increaseB);
double result = (double)FirstA ;// (double)(startA * startB);
return result;
}
static double getItem(long A, long B, long N)
{
//计算初始值
long startA = A - B;
long startB = A + B;
//计算递增
long increaseA = startA << 1;
long increaseB = startB << 1;
//求最大公约数,计算循环节长度
long maxcd = maxCommonDivisor(increaseA, increaseB);
long looplength = increaseA / maxcd + increaseB / maxcd;
//如果循环节长度为奇数,则不会重复
if ((looplength & 1) == 0)
{
//根据循环节长度推算本来的N值
long firstLoop = looplength >> 1;
if (N > firstLoop)
{
long increase = (N - firstLoop) / (looplength - 1) + 1;
N += increase;
}
}
long IndexA = (N * startB / A) >> 1;
long IndexB = (N * startA / A) >> 1;
long FirstA = IndexA * increaseA - startA;
long FirstB = IndexB * increaseB - startB;
long remain = N - IndexA - IndexB;
if (remain > 0)
FirstA = Math.Min(FirstA + increaseA, FirstB + increaseB);
double result = (double)FirstA / (double)(startA * startB);
return result;
}