您的位置:首页 > 其它

大数加法 及 乘法

2016-05-19 21:06 309 查看
大数加法:比较好理解就不打注释了 (hdu1002)http://acm.hdu.edu.cn/showproblem.php?pid=1002

#include<stdio.h>
#include<string.h>
//#include<time.h>
int main()
{
int T;
scanf("%d",&T);
int k=1;
getchar();
for(int q = 0; q < T; q++)
{
char s1[1010],s2[1010];
int num1[1010] = {0},num2[1010] = {0};
scanf("%s %s",s1,s2);
printf("Case %d:\n",k);
int i,j,len1,len2;
len1 = strlen(s1);
len2 = strlen(s2);
for(i = len1 - 1,j = 0; i >= 0; i--)
{
num1[j++] = s1[i] - '0';
}
for(i = len2 - 1,j = 0; i >= 0; i--)
num2[j++] = s2[i] - '0';
for(i = 0; i < 1008; i++)
{
num1[i]+=num2[i];
if(num1[i] > 9)
{
num1[i] -= 10;
num1[i + 1]++;
}
}
printf("%s + %s = ",s1,s2);
int flag = 1;
for(i = 1009; i >= 0; i--)
{
if(num1[i]  == 0 && flag == 1)
continue;
else if(num1[i] != 0 && flag == 1)
flag = 0;
if(flag == 0)
printf("%d",num1[i]);
}
if(k == T )
printf("\n");
else
printf("\n\n");
k++;
}
// printf("%.2lf\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}


整理的大数乘法,为了避免忘记,加强一下记忆,可以自己先按照笔算的时候的算法写一遍,再按照代码的思路写一下,进行一下对比可以很快了解代码思路的。

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main(void)
{
char s1[510],s2[510],temp[510];
int a[510],b[510],c[1010];
while(scanf("%s%s",s1,s2)==2)
{
int i,j,h;
int len1,len2;
if(strlen(s1)<strlen(s2))  //首先保证前一个长度要大于等于后一个
{
strcpy(temp,s1);
strcpy(s1,s2);
strcpy(s2,temp);
}
len1=strlen(s1);
len2=strlen(s2);
memset(c,0,sizeof(c)); //积数组的初始化
for(i=len1-1,j=0;i>=0;i--)
a[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
b[j++]=s2[i]-'0';
for(i=0;i<len2;i++) //第二个数的的当前位要乘以第一个数的每一位之后在相加
for(j=0;j<len1;j++)
c[i+j] += a[j]*b[i]; //累加
for(i=0;i<2*len1;i++)   //乘法时积数组的长度最大不会超过最大的那个乘数长度
if(c[i]>=10)
{
c[i+1] += c[i] / 10;
c[i] = c[i] % 10;
}
i=2*len1;
while(c[i]==0) //处理前导0
i--;
if(i<0)  //积等于0的情况
printf("0\n");
else
{
for(;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
}
return 0;
}



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