一道簡單的做業題的延伸,最優化的算法

題目:
2^0+2^1+2^2+2^3+2^4....+2^31安全

2的次方相加,不要使用math庫的pow函數
"譚浩強"版,效率最低,兩次遍歷函數

#include<stdio.h>
int main(void)
{
        double mat=0;
        int i=1;
        int j=0;
        for(i=0;i<31;i++)
        {
                double Arr=2;
                for(j=0;j<i;j++)
                {
                        Arr=2*Arr;
                }
                mat=mat+Arr;
        }
        mat++;
        printf("%f",mat);
}

優化版,一次遍歷性能

#include<stdio.h>

int main(void){
        long long int sum =1;
        int count;
        long long int power = 1;

        for(count=1;count<32;count++){
                power = power*2;
                sum = sum + power;
        }

        printf("sum=%lld\n",sum);

}

最優化版,位運算優化

#include <stdio.h>

int main(int argc, char** argv) {
    int i;
    unsigned int sum = 0;
    for(i=0;i<32;i++)
    {
       sum += 1 << i;
    }
    printf("%ld\n", sum);
}

tips:code

不能用 double,浮點格式沒法準確表示大多數整形數,並且性能差,更不能用 <math.h> 裏的 pow() 函數了。
不能用 int。 如今的x86和AMD64平臺,基本上 int 就是 32 位的了,題目要加到 2^31 次方,signed int 已經溢出了。不過正好在 unsigned int 範圍裏。爲安全能夠用 unsigned long 。
可是算 2^31 用循環的都是僞電工,(1 << 31) 就是 2^31 了…………
順便說起C語言沒有冪運算符,(2 ^ 31) 這個表達式在C語言裏結果是29。
公式:2^32-1
不用循環的bt寫法...printf("%u\n", ~0);ip

相關文章
相關標籤/搜索