110,539
社区成员
发帖
与我相关
我的任务
分享
public class ComputeH
{
public static void Compute(int x)
{
int cnt = (int)System.Math.Ceiling(((System.Math.Sqrt(8 * x + 1) - 1) / 2));
for (int i = 2; i <= cnt; i++)
{
if (i == 2 && x % 2 != 0)
{
Console.WriteLine((x / 2) + "+" + ((int)System.Math.Ceiling((double)x / 2)) + "=" + x);
}
else if (i % 2 != 0 && x % i == 0)
{
print1(x, i);
}
else if (i % 2 == 0 && x % i == i / 2)
{
print2(x, i);
}
}
}
private static void print1(int x,int i)
{
int[] tmp = new int[i];
for (int j = 0; j < i; j++)
{
tmp[j] = x / i;
}
for (int j = 0; j < (i / 2); j++)
{
tmp[j]-=(i/2-j);
tmp[i-j-1] += (i/2 - j);
}
printArray(tmp, x);
}
private static void print2(int x, int i)
{
int[] tmp = new int[i];
for (int j = 0; j < i; j++)
{
tmp[j] = x / i;
}
tmp[i - 1] += x % i;
for (int j = i-2; j >= 1; j--)
{
int t = tmp[j];
tmp[j] += (tmp[j + 1] - 1 - t);
tmp[j - 1] -= (tmp[j + 1] - 1 - t);
}
printArray(tmp, x);
}
private static void printArray(int[] array,int x)
{
for (int j = 0; j < array.Length - 1; j++)
{
Console.Write(array[j] + "+");
}
Console.WriteLine(array[array.Length - 1] + "=" + x);
}
}