您的位置:首页 > 其它

【模版】大数乘法、加法模版

2013-12-28 23:15 337 查看
啦啦啦,模版终于写出来了,以后大数的乘加法再也不担心了。

介于只对自己的个别数据进行了测试,所以还是把模版晒出来吧,大家一起试试,有问题一定要第一时间反馈啊!!

还有,那些逃避指针的小伙伴们,咳咳,我就不说什么了,反正打死你们也不相信我没用指针。

 
//大数问题之大数(250位)乘法、加法模版
#include<stdio.h>
#include<string.h>

void hs(char *s,long long *n); //由字符串变为整形数组
void pr(long long *n,int num); //打印整形数组(大数)

char sn1[260];     //输入第一个大数
char sn2[260];     //输入第二个大数
long long n1[70];  //保存第一个大数
long long n2[70];  //保存第二个大数
long long en[150]; //保存最后结果

int main()
{
int i,k;

while (~scanf ("%s%s",sn1,sn2))
{
//乘法特殊情况
if (sn1[0] == '0' || sn2[0] == '0')
{
printf ("0\n");
continue;
}

//初始化
memset (n1,0,sizeof n1);
memset (n2,0,sizeof n2);
memset (en,0,sizeof en);
//把字符串转化为整形数组
hs (sn1,n1);
hs (sn2,n2);

//计算
//乘法
for (i = 69;i >= 0;i--)
for (k = 69;k  >= 0;k--)
{
en[i + k + 1] += n1[i] * n2[k];
}

//加法
for(i = 69;i >= 0;i--)
en[i + 70] = n1[i] + n2[i];

//把结果标准化
//乘法&加法
for (i = 139;i >= 0;i--)
{
if (en[i] >= 10000)
{
en[i - 1] += (long long)(en[i] / 10000);
en[i] = en[i] % 10000;
}
}

//打印结果
pr(en,140);
}

return 0;
}

void hs(char *s,long long *n)
{
char *ps = s + strlen(s) - 1;
char *tmp = NULL;
long long *pn = &n[69];
long long tim = 3;

while (ps >= s)
{
if ((ps - 3) >= s)
{
while(tim >= 0)
{
*pn = (*pn) * 10 + (*(ps - tim) - '0');
tim--;
}
pn--;
tim = 3;
}else
{
tmp = s;
while (tmp <= ps)
{
*pn = *pn * 10 + (*tmp - '0');
tmp++;
}
}

ps -= 4;
}
}

void pr(long long *n,int num)
{
long long *p = n;

while (*p == 0)
p++;
//第一个数一定要特殊处理
if (p > &n[num - 1])
{
printf ("0\n");
}
else
{
printf ("%lld",*p);
p++;
while (p <= &n[num - 1])
{
printf ("%04lld",*p);
p++;
}
printf ("\n");
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: