C#实现从x到n的加法(按顺序从x到n,例如1+2+3+…+100,或者100+99+98+…+1,逐级+1或-1)
以前我们写1加到100是这样写的:
int result =0;
for(i=1,i<=100,i++){
result += i;
}
return result;
但是这个算法的时间复杂度为o(n)(应该是吧)
后来读《大话数据结构》的时候就看到了简化版的:
return (1+100) * (100/2);
复杂度降低了很多,
因此我要写一个类似的算法:计算x到n的加法和(所有数值都为非负、整数,并且逐渐+1):
static int QuickAdd(int start, int end)
{
int length = end - start + 1;
return (start + end) * length / 2;
}
完成了!!!
length就是所有数的个数的一半
测试案例:
static void Main(string[] args)
{
int a = QuickAdd(0, 100);
int b = QuickAdd(2, 5);
int c = QuickAdd(4, 5);
int d = QuickAdd(10, 11);
Console.WriteLine("QuickAdd(0,100):" + a);
Console.WriteLine("QuickAdd(2,5):" + b);
Console.WriteLine("QuickAdd(4,5):" + c);
Console.WriteLine("QuickAdd(10,11):" + d);
Console.ReadLine();
}
结果如下:
QuickAdd(0,100):5050
QuickAdd(2,5):14
QuickAdd(4,5):9
QuickAdd(10,11):21
算了一下基本上 是对的
改进版:
static int QuickAdd(int start, int end)
{
int length =Math.Abs( end - start) + 1;
return (start + end) * length / 2;
}
是的没错就只是加了一个math.abs这真是太水 厉害了
测试案例:
static void Main(string[] args)
{
int a = QuickAdd(100, 0);
int b = QuickAdd(5, 2);
int c = QuickAdd(5, 4);
int d = QuickAdd(11,10);
Console.WriteLine("QuickAdd(100,0):" + a);
Console.WriteLine("QuickAdd(5,2):" + b);
Console.WriteLine("QuickAdd(5,4):" + c);
Console.WriteLine("QuickAdd(11,10):" + d);
Console.ReadLine();
}
反过来了,输出如下:
QuickAdd(100,0):5050
QuickAdd(5,2):14
QuickAdd(5,4):9
QuickAdd(11,10):21
所以现在可以不用管start是否小于end了!!!
看看后面能不能想到不管正负数的,想到再回来!