一道简单的作业题的延伸,最优化的算法

本文介绍了三种不同的方法来计算2的从0到31次方的累加值,包括谭浩强版的两遍历算法、一次遍历优化版以及最优化的位运算方法,并讨论了数据类型选择的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
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:

不能用 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值