ZJUTOJ 1217 大数乘法

来源:互联网 发布:公司网络管理通知 编辑:程序博客网 时间:2024/06/05 13:31
        大数乘法和加法类似,不过算法更为奥妙,此题还要注意标志位的选择!

Description:

给定一些大数,请计算其积。

Input:

输入数据中含有一些整数对(对数≤1000),若某对整数(整数位数≤200)的值为0 0,则表示输入结束。

Output:

每对整数对应一个乘法计算结果,输出该结果,每个结果输出完后应回车。

Sample Input:

2 312 340 0

Sample Output:

6408
#
include<stdio.h>#include<string.h>#define max 200int main(){int i,j,len1,len2,flag1,flag2;int a1[max+20],a2[max+20],c[max*2+20];char str1[max+20],str2[max+20];while(scanf("%s%s",str1,str2) )  {  if(strcmp(str1,"0")==0 && strcmp(str2,"0")==0 )//注意怎么判断结束     break;     if(strcmp(str1,"0")==0 )//判断如果有等于零的情况怎么算     printf("0");     if(strcmp(str2,"0")==0 )     printf("0");         flag1=0;  //标志位必须在这里定义,每次循环清零,到后边输出的时候判断是否有负号! flag2=0;    if(str1[0]=='-')  {  flag1=1;    str1[0]='0';    } if(str2[0]=='-')  {  flag2=1;   str2[0]='0';}  memset(a1,0,sizeof(a1));memset(a2,0,sizeof(a2));memset(c,0,sizeof(c));len1=strlen(str1);len2=strlen(str2);for(j=0,i=len1-1;i>=0;i--)a1[j++]=str1[i]-'0';for(j=0,i=len2-1;i>=0;i--)a2[j++]=str2[i]-'0';for(i=0;i<len2;i++)//注意谁乘谁 {for(j=0;j<len1;j++)c[j+i]+=a2[i]*a1[j];}for(i=0;i<max*2;i++){c[i+1]+=c[i]/10;//容易缺少累加符号 c[i]=c[i]%10;}for(i=max*2+19;(i>=0)&&(c[i]==0);i--);if((strcmp(str1,"0")!=0 )) {   if(strcmp(str1,"0")==0 )   if((flag1&&!flag2)||(!flag1&&flag2))    printf("-");  for(;i>=0;i--)  {  printf("%d",c[i]);  }    }printf("\n");  }  return 0;}

0 0