写了个算法,就是顺序加的那种

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了!!!

看看后面能不能想到不管正负数的,想到再回来!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值