题目:
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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。