C语言求2的n次方

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次方

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容