• 寫一個函數計算當參數為 n(n很大) 時的值 12+34+56+7……+n


    看到網路上一篇blog一個問題,引發一群網友的討論。

    Q:寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n

    這是個常見的級數問題,我們必須化簡成closed form 來得到最佳的效率。

    一般解法: 主要使用 迴圈

    long fn(long n) {
      long temp=0;
      int i,flag=1;
      if(n<=0) {
        printf("error: n must > 0);
        exit(1);
      }
      for(i=1;i<=n;i++) {
        temp=temp+flag*i;
        flag=(-1)*flag;
      }
      return temp;
    }

    用數學化簡:

    long fn(long n) {
      if(n<=0) {
        printf("error: n must > 0);
        exit(1);
      }
      if(0==n%2)
        return (n/2)*(-1);
      else
        return (n/2)*(-1)+n;

     n%2 也可以用 n&1來取代。n/2 用 n>>1

    long fn(unsigned long n){
    return (long)n/2*(-1)+((n%2)?n:0);
    }
    

    更牛逼的還用assembly language

    long fn(long n)
    {
    __asm{
    mov eax,n ; Load n to AX
    inc eax ; AX = AX + 1.
    shr eax,1 ; AX divides by 2.
    jnc EXIT ; Exit if AX is a odd number.
    neg eax ; AX = -AX ;
    EXIT:
    }
    }
  • 相关阅读:
    js基础四
    序列化和反序列化
    数组
    枚举
    Class对象和反射
    字符串String
    对象的克隆
    异常处理机制
    多继承和代码块
    接口和抽象类
  • 原文地址:https://www.cnblogs.com/bittorrent/p/2843457.html
Copyright © 2020-2023  润新知