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;
}