标签:
昨天刚写了个大数加法,今天又来了个大数乘法,其实解法差不多,只不过换成了好多个大数的相加而
已,看别人的算法其实跟我的也差不多,都是这个姿势。wa了一次,竟然忘了考虑0的情况,以后交题之前,都要判
断一下边缘数据,大数据和小数据,要不就是白白被扣时间啊
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; char a[300];//存放输入的第一组数据 char b[300];// 存放输入的第二组数据 int c[600];//存放每一位数与另一组数据相乘后的结果 int d[600];//用来保存已经计算过的每一位数与b相乘之后的和 void solve(char c[])//将输入的数据翻转 { char t; int len=strlen(c); for(int i=0; i<=(len-1)/2; i++) { t=c[i]; c[i]=c[len-1-i]; c[len-1-i]=t; } } int main() { int i,j,x,k,q,up,up1,max1; while(scanf("%s%s",a,b)!=EOF) { if(strcmp(a,"0")==0||strcmp(b,"0")==0)//处理输入是0的情况 { printf("0\n"); continue; } memset(d,0,sizeof(d)); memset(c,0,sizeof(c)); solve(a); solve(b); int lena=strlen(a); int lenb=strlen(b); max1=k=0; for(i=0;i<lena;i++)//遍历a数组的每一位数字,让其与b数组的数相乘 { up=0; for(k=0;k<i;k++) c[k]=0; for(j=0;j<lenb;j++) { c[k]=(a[i]-'0')*(b[j]-'0')+up; up=c[k]/10; c[k]=c[k]%10; k++; } if(up!=0) c[k++]=up;//c数组存放第i位数与b相乘后的结果 max1=max(max1,k); for(q=0,up=0;q<max1;q++) { if(q>=k) c[q]=0; d[q]=c[q]+d[q]+up; up=d[q]/10; d[q]=d[q]%10; } if(up!=0) d[max1++]=up;//d数组存放前i位数分别与b相乘后的和 } int flag=1; for(j=max1-1;j>=0;j--) { if(flag==1&&d[j]==0)//用来处理前导0问题 continue; printf("%d",d[j]); flag=0; } printf("\n"); } }
标签:
原文地址:http://blog.csdn.net/sinat_22659021/article/details/46011083