C语言计算2的1024次方

C语言计算2的1024次方

迅雷有这么一道笔试题,编程计算2的1024次方。

所谓2的1024次方,就是有1024个2相乘,于是有些同学顺手就能写出代码:

int main()
{
    int reslut = 1;
    for (int i = 0; i < 1024; i++)
    {
        result *= 2;
    }
    printf("%d\n", result);
    return 0;
}

如果你也这样写代码,那简历上顶多能写了解C语言,离掌握和精通还差很远。

C语言中的int类型一般占4字节,4个字节就是32位二进制,即使是无符号数,能表示的最大数字也就是2的32次方减一,离2的1024次方还差很远。

所以单纯的用整数来保存结果肯定不行。

一种办法是当作字符串来处理,模拟乘2进位的方法。
来一个数组,数组尽量大一些,初始化成1,乘以2的结果分别是2 4 8。

在这里插入图片描述

再乘以2的时候,结果是6并且向后进一位。

在这里插入图片描述
再乘以2的时候,结果是6并且向后进一位。

在这里插入图片描述
最终得到的字符串来个逆序就行。

这种办法不仅能计算2的1024次方,再大一些,问题也不大。

代码直接贴上,需要的话可以暂停下看看。

#include <stdio.h>
#include <string.h>

void reverse(char *r) 
{
    int length = strlen(r);
    int i;
    char ch; 
    for (i = 0; i < length / 2; i++)
    {   
        ch = r[i];
        r[i] = r[length - 1 - i]; 
        r[length - 1 - i] = ch; 
    }   
}

void NPowerOfTwo(int n, char *res)
{
    int i, length, j, num, carry;
    for (i = 0; i < n; i++)
    {
        carry = 0;
        for (j = 0; j < strlen(res); j++)
        {
            num = res[j] - '0';
            num = (num << 1) + carry;
            carry = num / 10;
            res[j] = num % 10 + '0';
        }   
        if (carry > 0)
            res[j] = carry + '0';
    }       

    reverse(res);
}   

int main( )
{
    int n;
    char result[2048] = {'1'};

    NPowerOfTwo(1024, result);

    printf("%s\n", result);

    return 0;
}

在牛客的排行榜上,速度最快,占用空间最小的并不是这种解法。

int类型虽然不好表示这么大的数,但是C语言中还有一种long double类型,具体的长度不同的编译器可能略有不同,10字节、12字节、16字节都有。我用的Ubuntu环境,long double类型确实能解决2的1024次方。

int main()
{
    long double reslut = 1.0;
    for (int i = 0; i < 1024; i++)
    {
        result *= 2.0;
    }
    printf("%.0Lf\n", result);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值