高精度问题,C语言,求二的n次方
目的:掌握大数的表示,通过数组实现大数的运算。内容:输入程序,验证结果;计算2的N次方。要求:N为整数范围内的数,按照规范形式输出计算结果(每行50位数)。...
目的:掌握大数的表示,通过数组实现大数的运算。
内容:输入程序,验证结果;计算2的N次方。
要求:N为整数范围内的数,按照规范形式输出计算结果(每行50位数)。 展开
内容:输入程序,验证结果;计算2的N次方。
要求:N为整数范围内的数,按照规范形式输出计算结果(每行50位数)。 展开
2个回答
展开全部
//自己一个一个代码敲的,希望对题主有用
int main()
{
int num = 1000;
char ret[1000];
int N;
int retLength;
while (scanf("%d", &N)&& N >= 0)
{
memset(ret, -1, sizeof(ret));
ret[0] = 1;
retLength = 0;
if (0 == N)
{
printf("%d\n", 1);
continue;
}
else
{
for (int i = 0; i < N; ++i)
{
char isCarry = 0;
int j = 0;
for (j = 0; j < num; ++j)
{
if (-1 == ret[j])
{
break;
}
//模拟乘2过程
ret[j] *= 2;
ret[j] += isCarry;
if (ret[j]>=10)
{
isCarry = 1;
ret[j] %= 10;
}
else
{
isCarry = 0;
}
}
//一轮模拟乘2结束, 判断是否还有进位,
//如果有进位,则在下位赋值为1
if (1 == isCarry)
{
ret[j++]=1;
isCarry = 0;
}
//最后一次模拟需要保存,总共计算了的长度。
if (i == N - 1)
{
retLength = j;
}
}
//最后格式化输出,50次一个换行,
//注意计算结果保存是逆序。如2^10 的保存结果为4201
for (int i = 0; i < retLength; ++i)
{
printf("%c", ret[retLength - i - 1] + '0');
if (0 == (i+1)%50)
{
printf("\n");
}
}
}
printf("\n");
}
return 0;
}
展开全部
#include<stdio.h>
#include<string.h>
#define MAX 100
char a[MAX],b[MAX];//用字符串进行数字的输入
int x[MAX+10],y[MAX+10],z[MAX*2+10];//积的位数最多是因数位数的两倍
int main()
{
int len1,len2,i,j;
while(~scanf("%s %s",a,b))
{
len1=strlen(a);
len2=strlen(b);
for(j=0,i=len1-1;i>=0;i--)//将字符串中字符转化为数字,并倒序储存
x[j++]=a[i]-'0';
for(j=0,i=len2-1;i>=0;i--)
y[j++]=b[i]-'0';
for(i=0;i<len1;i++)//将因数各个位上的数字与另一个各个位上的数字相乘
{
for(j=0;j<len2;j++)
z[i+j]=z[i+j]+x[i]*y[j];//先乘起来,后面统一进行进位
}
for(i=0;i<MAX*2;i++)//进行进位
{
if(z[i]>=10) //若>=10
{
z[i+1]=z[i+1]+z[i]/10; //将十位上数字进位
z[i]=z[i]%10; //将个位上的数字留下
}
}
for(i=MAX*2;i>0;i--) //删除0的前缀
{
if(z[i]==0)
continue;
else
break;
}
for(;i>=0;i--) //倒序输出
printf("%d",z[i]);
printf("\n");
}
return 0;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询