十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NOI openjudge 计算2的N次方

NOI openjudge 计算2的N次方 12:计算2的N次方描述任意给定一个正整数N(N100)计算2的n次方的值。输入输入一个正整数N。输出输出2的N次方的值。简单的解释一下为什么这题要用数组写。题目要求的是求2的n次方2^100有多大呢有10^30那么大在C语言中最大的long long也只有2^63那么大大概10^18所以我们就要用数组来模拟那我们该如何用数组模拟呢这也是大多数人想问的问题吧 我下面画个图就很容易理解了应该十分清晰我这里建立了一个大小为10的数组方便解释第一行是数组的编号这个应该没问题吧有问题的话去看https://blog.csdn.net/chdcb/article/details/120630200?spm1001.2014.3001.550101234567890000000001我们都知道2^01所以我在末尾那里赋值了个1假如我们要求2^5我用数组模拟一下流程01234567890000000002发现了什么a[9](a是数组名字)那里变成了2此时是2^101234567890000000004a[9]那里变成了4此时是2^201234567890000000008a[9]那里变成了8此时是2^3012345678900000000016a[9]那里变成了16此时是2^4(聪明的你一定发现了问题所在吧)我们的目标是每一位数组存一个数字所以当一位数组的里面数字10时我们要做进一操作01234567890000000016这个样子才是我们需要的数组形式这下你一定可以发现为什么要用数组模拟了吧我们只需要求每一位*2就可以了这样就不怕会爆范围了如果10进一就行了数组可以开很大开个1e6不是问题而这道题数组大小大概只要30就行了我们继续模拟 2^5012345678900000000212进一处理一下01234567890000000032大致思路是这样的下面结合代码讲解#includestdio.h int main(){ int a[501]{0}; //开一个大小为500的数组小一点也无所谓的 a[500]1; //a[500]赋值为1因为2^01 int n; scanf(%d,n); for(int i1;in;i){ //乘以n次2 for(int j1;j500;j){ //每一位都乘 a[j]*2; } for(int j500;j1;j--){ //从后往前进一这个应该没啥问题 if(a[j]10){ a[j-1]a[j]/10; a[j]%10; } } } bool flagfalse; for(int i1;i500;i){ if(a[i]!0){ //flag用来去除前导0 flagtrue; } if(flag){ printf(%d,a[i]); } } }
返回列表