ZJUTOJ 1217 大数乘法

        大数乘法和加法类似,不过算法更为奥妙,此题还要注意标志位的选择!

Description:

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

Input:

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

Output:

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

Sample Input:

2 3
12 34
0 0

Sample Output:

6
408
 
 
 
#
include<stdio.h>
#include<string.h>
#define max 200
int 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值