C语言求2的n次方。
计算机整数的范围最大是 0~2^64-1。
如果计算2的100次方,使用浮点数将损失结果的精度。
可以将全部结果存储在数组中。
下面是具体的实现:
//
// main.c
// 2n
//
// Created by cc on 2021/12/10.
//
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 2000
#define MOD 1000000000
#define MOD_LENGH 9
int result[MAX_LENGTH];
//计算2的n次方,返回结果的位数
int powers_2(int n);
int main(int argc, const char * argv[]) {
int n = 100;
int i;
int length;
for (i = 1; i <= n; i++) {
printf("2^%d = ", i);
length = powers_2(i);
printf("len = %d\n\n", length);
}
printf("\n");
return 0;
}
//计算结果有多少位
int results_length(int *a, int n){
int length = 0;
int first = a[n];
// printf("\n");
length = 0;
while (first) {
length++;
first /= 10;
}
length += n * MOD_LENGH;
return length;
}
//输出计算结果
void print_results(int *a, int n){
int i = n;
printf("%d", a[i]);
for (i--; i>= 0; i--) {
printf("%0*d", MOD_LENGH, a[i]);
}
printf("\n");
}
int powers_2(int n){
memset(result, 0, MAX_LENGTH * sizeof(int));
int index;//存储下标位置
long carry;//进位
long tempresult;//存储中间结果
long i,j;
int length;//长度
result[0] = 1;
index = 0;
for (i = 1; i <= n; i++) {
carry = 0;
for (j = 0; j <= index; j++) {
tempresult = result[j] * 2L + carry;
carry = tempresult / MOD;
result[j] = tempresult % MOD;
}
while (carry) {
index++;
result[index] = carry % MOD;
carry /= MOD;
}
}
print_results(result, index);
length = results_length(result, index);
return length;
}
下面的地址可以通过输入n的值直接查看结果:
计算2的n次方