首页 > 其他 > 详细

高精度加法与乘法

时间:2015-01-19 20:58:55      阅读:224      评论:0      收藏:0      [点我收藏+]

//加法

#include <stdio.h>
#include <string.h>
#define MAXN 200

int an1[MAXN+10];
int an2[MAXN+10];
char szLine1[MAXN+10];
char szLine2[MAXN+10];
int main()
{
	scanf("%s",szLine1);
	scanf("%s",szLine2);
	int i,j;
	memset(an1,0,sizeof(an1));
	memset(an2,0,sizeof(an2));

	int nlen1 = strlen(szLine1);
	for(j=0,i=nlen1-1;i>=0;i--)
		an1[j++] = szLine1[i]-'0';//逆序整型数组
	int nlen2 = strlen(szLine2);
	for(j=0,i=nlen2-1;i>=0;i--)
		an2[j++] = szLine2[i]-'0';

	for(i=0;i<MAXN;i++)
	{
		an1[i]+=an2[i];	//逐位相加
		if(an1[i]>=10)
		{
			//看是否进位
			an1[i]-=10;
			an1[i+1]++;//进位
		}
	}

	for(i=MAXN;(i>=0)&&(an1[i]==0);i--);
	if(i>=0)
	{
		for(;i>=0;i--)
			printf("%d",an1[i]);
	}
	else printf("0\n");

	return 0;
} 

//乘法

#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000

int a[MAX_LEN+10],b[MAX_LEN+10],c[MAX_LEN*2+10];
char str1[MAX_LEN+10],str2[MAX_LEN+10];
int main()
{
	scanf("%s",str1);
	scanf("%s",str2);
	int i,j;
	int len1,len2;
	len1 = strlen(str1);
	len2 = strlen(str2);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));

	for(j=0,i=len1-1;i>=0;i--)//倒转第一个整数
		a[j++] = str1[i]-'0';
	for(j=0,i=len2-1;i>=0;i--)
		b[j++] = str2[i]-'0';

	for(i=0;i<len1;i++)	//两数字相乘,每次一位
	{
		for(j=0;j<len2;j++)
			c[i+j] += b[j]*a[i]; //先乘起来,后面统一处理进位
								 //一个数的第i位和另一个数的第j位相乘所得的数,是要累加到结果的第[i+j]位上的
	}

	for (i = 0; i < MAX_LEN*2; i++) //统一处理进位循环问题
	{
		if(c[i]>=10)
		{
			c[i+1]+=c[i]/10;	//后一位加上进位
			c[i]%=10;			
		}
	}

	for(i=MAX_LEN*2;(c[i]==0)&&(i>=0);i--); //跳过高位的0
	if(i>=0)
		for(;i>=0;i--)
			putchar('0'+c[i]);
	else
		printf("0");

	return 0;
}


高精度加法与乘法

原文:http://blog.csdn.net/huolang_vip/article/details/42879859

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!