迅雷有这么一道笔试题,编程计算2的1024次方。
所谓2的1024次方,就是有1024个2相乘,于是有些同学顺手就能写出代码:
int main() { int reslut = 1; for(inti=0;i< 1024; i++) { result *= 2; } printf("%d ", result); return 0; }如果你也这样写代码,那简历上顶多能写了解C语言,离掌握和精通还差很远。
C语言中的int类型一般占4字节,4个字节就是32位二进制,即使是无符号数,能表示的最大数字也就是2的32次方减一,离2的1024次方还差很远。
所以单纯的用整数来保存结果肯定不行。
一种办法是当作字符串来处理,模拟乘2进位的方法。
来一个数组,数组尽量大一些,初始化成1,乘以2的结果分别是2 4 8。
再乘以2的时候,结果是6并且向后进一位。
再比如64,4乘以2等于8,不用进位,6乘以2等于2,向后进一位。
最终得到的字符串来个逆序就行。
这种办法不仅能计算2的1024次方,再大一些,问题也不大。
代码直接贴上,需要的话可以暂停下看看。
#include在牛客的排行榜上,速度最快,占用空间最小的并不是这种解法。#include 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; charresult[2048]={'1'}; NPowerOfTwo(1024,result); printf("%s ", 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 ", result); return 0; }
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
处理器
+关注
关注
68文章
18275浏览量
222163 -
二进制
+关注
关注
2文章
705浏览量
41250 -
C语言
+关注
关注
180文章
7530浏览量
128717 -
字符串
+关注
关注
1文章
551浏览量
20123 -
模拟器
+关注
关注
2文章
817浏览量
42698
原文标题:计算2的1024次方
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
二次方程式编程求助
最近在做项目中需用到二次方程式寻优,发现LabView中没有附上相应的范例(函数->数学->最优化->二次方程式编程),只有连线版上的几个引脚说明,如何运用该模块进行编程实在是困扰
发表于 01-27 21:22
在labview中怎样将三次方开出,正负都有
为什么,为什么,在labview中开三次方后,信号只有正的,负的怎么找不到?要怎么做才可以把信号的三次方完整的开出。。。。此时甚急,快来相助,不胜感激!!!!!
发表于 05-12 13:40
数组更新现在只能计算第一次的,该如何计算之后的呢?
请教各位高手了,如图所示,想计算出每一秒中0.135到0.165s之间30ms内的最值,但貌似只能计算第一次的,该如何计算之后的呢
发表于 06-10 11:22
口袋编程计算机
` 口袋编程计算机(PocketProgrammingComputer)致力于降低青少年学习编程门槛,提高青少年硬件动手能力。 01前言 从计算机出现以来,伴随着发展最快的是
发表于 08-04 17:52
请教DSP关于8次函数的计算问题
,floa肯定t够用。 目前采用了两种方式实现,第一种是调用pow(a,b)函数,完成8次方到0次方的累加,是双精度的肯定够用,最后赋值保存成float,计算的结果正常。 第二种方式是直接根据公式直接
发表于 09-11 10:42
请问乘积超过2的32次方怎么处理?
我的程序是这样的:accel_lim = ((long)step*decel) / (accel+decel);由于step和decel比较大,所以他们的乘积可能超过2的32次方-1,但是除以(accel+decel)后肯定是小于2
发表于 02-27 08:38
教程 | 参数例化时自动计算位宽的解决办法
一次,clogb2就会自增1,直到depth除不动为止,这个时候clogb2输出的就是这个数以2为底的对数。注意一下,该函数要求depth必须是2
发表于 01-04 18:39
基于Arduino的编程计算器
描述Arduino Nano 编程计算器基于Arduino的编程计算器,用于教育和娱乐。成分Arduino纳米LCD1602 16x2 带
发表于 09-09 07:04
嵌入式中位宽的计算
转换为二进制,查一下有多少位。 很明显需要26位。 如果每次的计算都需要计算器的话,很多的时候可能不太方便。这里笔者整理出一种“看一眼就知道位宽”的技巧。 首先需要牢记2的0次
发表于 03-02 19:52
1024是什么意思
最近在论坛上经常看到有些人会问1024是什么意思?为此,小编也查了一下关于1024。关于1024总体来说有几个方面的意思,主要有:一个是计算机系统的
发表于 10-26 09:56
•12.3w次阅读
评论