高精度加法与乘法

//加法

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值