描述
任意给定一个正整数N(N<=100),计算2的n次方的值。
输入
输入一个正整数N。
输出
输出2的N次方的值。
样例输入
5
样例输出
32
解题思路:
因为2的100次方数目较大,所以不能用普通的方法(pow(2,n))解决, 所以要考虑别样的方式。采用数组存储整数,用整数数组一个下标对应存储一位数字。
第一步,取一个数组,并且将数据的每个元素初始化为-1(这里不能使用初始化为零)
int ans[2500]={0};
memset(ans,-1,2500);//将数组每个数都初始化为-1
int i=0,j=0,k=1,n; //将k初始化为1;是为了输入为0,即2的0次方,输出为1
scanf("%d",&n);
ans[0]=1;//后面是数据相乘,所以第一个数是1,而不是0
这里使用了一个函数memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。(有链接的,可以看一下详细用法)
第二步,用2和数组内的每个元素相乘(计算完成后,需要把进位考虑进去)
for (i=0;i<n;i++)
{
j=0;//确保每一位都要乘以2,每次循环j从0开始
while (ans[j]!=-1)
{
ans[j]=ans[j]*2;
j++;
}
k=0;
while (ans[k]!=-1) //下面是考虑进位的情况
{
if (ans[k]>=10)
{
if (ans[k+1]==-1) //如果数组最高位需要进位,那么要注意下一位元素的值为-1
ans[k+1]=0;//并将它变成零,否则的话直接进位计算,就会错误。
ans[k+1]=ans[k]/10+ans[k+1]; //进位操作
ans[k]=ans[k]%10;
}
k++;
}
}
第三步,输出结果(这里我就不说了)
完整代码:
#include<stdio.h>
#include<string.h>
int main()
{
int ans[2500]={0};
memset(ans,-1,2500);//将数组每个数都初始化为-1
int i=0,j=0,k=1,n; //将k初始化为1;是为了输入为0,即2的0次方,输出为1
scanf("%d",&n);
ans[0]=1;
for (i=0;i<n;i++)
{
j=0;
while (ans[j]!=-1)
{
ans[j]=ans[j]*2;
j++;
}
k=0;
while (ans[k]!=-1)
{
if (ans[k]>=10)
{
if (ans[k+1]==-1)
ans[k+1]=0;
ans[k+1]=ans[k]/10+ans[k+1];
ans[k]=ans[k]%10;
}
k++;
}
}
for (i=k-1;i>=0;i--)
{
printf("%d",ans[i]);//反向输出
}
return 0;
}
当然这样做有点浪费储存空间,可以思考一下如何做一下改进。