C語(yǔ)言求2的n次方。
計(jì)算機(jī)整數(shù)的范圍最大是 0~2^64-1。
如果計(jì)算2的100次方,使用浮點(diǎn)數(shù)將損失結(jié)果的精度。
可以將全部結(jié)果存儲(chǔ)在數(shù)組中。
下面是具體的實(shí)現(xiàn):
//
// 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];
//計(jì)算2的n次方,返回結(jié)果的位數(shù)
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;
}
//計(jì)算結(jié)果有多少位
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;
}
//輸出計(jì)算結(jié)果
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;//存儲(chǔ)下標(biāo)位置
long carry;//進(jìn)位
long tempresult;//存儲(chǔ)中間結(jié)果
long i,j;
int length;//長(zhǎng)度
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;
}
下面的地址可以通過(guò)輸入n的值直接查看結(jié)果:
計(jì)算2的n次方