大二(上) Windows 高精度加法代码,高精度减法代码

大概的实现图样:

// 高精度加法  (封装)
#include <iostream>
#include <string>
using namespace std;

// string --> a[]
int StoA(string s, int a[])
{
	int n = s.size();
	for (int i = 0; i < n; i++)
	{
		a[n - 1 - i] = s[i] - 48;
		/* printf("a[%d]:%d\n", n - i - 1, a[n - i - 1]); */
	}
	return n;
}

// a[] --> string
string AtoS(int a[], int n)
{
	string s = "";
	for (int i = 0; i < n; i++)
	{
		char t = a[i] + 48;
		s = t + s;
	}
	return s;
}

// a[],n1 + b[],n2 --> c[],n3	
int Plus(int a[], int n1, int b[], int n2, int c[])
{
	int i, x, n3;
	if (n1 > n2)                   //将a[]或b[]所缺的位数赋值为0
	{
		n3 = n1;
		for (i = n2; i < n3; i++)
			b[i] = 0;
	}
	else
	{
		n3 = n2;
		for (i = n1; i < n3; i++)
			a[i] = 0;
	}
	int jw = 0;		               // 进位 
	for (i = 0; i < n3; i++)
	{
		x = a[i] + b[i] + jw;
		c[i] = x % 10;
		jw = x / 10;
		/*printf("c[%d]=%d,jw=%d\n",i, c[i],jw);*/
	}
	if (jw > 0)		              // 如果还有向高位的进位 
	{
		c[n3] = jw; 
		n3++;
	}
	i = 0;
	return n3;
}

int main()
{
	string s1 = "389"; int a[1000], n1;
	string s2 = "334";  int b[1000], n2;
	string s3 = "";    int c[1000], n3;
	n1 = StoA(s1, a);				// s1 --> a[]
	n2 = StoA(s2, b);				// s2 --> b[]	
	n3 = Plus(a, n1, b, n2, c);     // a[],n1 + b[],n2 --> c[],n3	
	
	int g;
	if (n1 > n2)
	    g = n1;
	else
		g = n2;
	for (int i = g - 1; i >= 0; i--)
		printf("a[%d]\t", i);
	cout << "a[ ] " << endl;

	for (int i = g - 1; i >= 0; i--) 
	{
		if (a[i] != 0)
		    printf("%d\t", a[i]);
		else
			printf("\t");
	}
	cout << endl ;
	for (int i = g - 1; i >= 0; i--) 
	{
		if(b[i]!=0)
		    printf("%d\t", b[i]);
		else
			printf("\t");
	}
	cout << endl;

	for (int i = g - 1; i >= 0; i--) 
		printf("b[%d]\t", i);
	cout << "b[ ] " << endl;
	cout << "----------------------------" << endl;
	for (int i = n3-1; i >= 0; i--)  
		printf("%d\t", c[i]);
	cout << "c[ ] " << endl;

	s3 = AtoS(c, n3);			 	// c[] --> s3
	cout << s3 << endl;
	
	system("pause");
	return 0;
}
/*
	  a[2]  a[1]  a[0]      a[]:
		3     8     9		s1:
	+	      3     4		s2:
			b[1]  b[0]      b[]:
  ----------------------
		4     2     3 		c[]:
*/

// 高精度减法  (封装)
#include <iostream>
#include <string>
using namespace std;

// string --> a[]
int StoA(string s, int a[])
{
	int n = s.size();
	for (int i = 0; i < n; i++)
	{
		a[n - 1 - i] = s[i] - 48;
	}
	return n;
}

// a[] --> string
string AtoS(int a[], int n)
{
	string s = "";
	for (int i = 0; i < n; i++)
	{
		char t = a[i] + 48;
		s = t + s;
	}
	return s;
}

// a[],n1 + b[],n2 --> c[],n3	
int Plus(int a[], int n1, int b[], int n2, int c[])
{
	int i, x, n3;
	if (n1 > n2)                   //将a[]或b[]所缺的位数赋值为0
	{
		n3 = n1;
		for (i = n2; i < n3; i++)
			b[i] = 0;
	}
	else
	{
		n3 = n2;
		for (i = n1; i < n3; i++)
			a[i] = 0;
	}

	int jw = 0;		               // 进位 
	for (i = 0; i < n3; i++)
	{
		x = a[i] - b[i] + jw;
		c[i] = x % 10;
		jw = 0;
		if (c[i] < 0)
		{
			c[i] += 10;
			jw = -1;
		}
	}
	if (jw < 0)		              // 如果还有向高位的进位 
	{
		c[n3] = jw;
		n3++;
	}
	i = 0;
	return n3;
}

int main()
{
	string s1 = "383"; int a[1000], n1;
	string s2 = "194";  int b[1000], n2;
	string s3 = "";    int c[1000], n3;
	n1 = StoA(s1, a);				// s1 --> a[]
	n2 = StoA(s2, b);				// s2 --> b[]	
	n3 = Plus(a, n1, b, n2, c);     // a[],n1 + b[],n2 --> c[],n3	

	int g;
	if (n1 > n2)
		g = n1;
	else
		g = n2;
	for (int i = g - 1; i >= 0; i--)
		printf("a[%d]\t", i);
	cout << "a[ ] " << endl;

	for (int i = g - 1; i >= 0; i--)
	{
		if (a[i] != 0)
			printf("%d\t", a[i]);
		else
			printf("\t");
	}
	cout << endl;
	for (int i = g - 1; i >= 0; i--)
	{
		if (b[i] != 0)
			printf("%d\t", b[i]);
		else
			printf("\t");
	}
	cout << endl;

	for (int i = g - 1; i >= 0; i--)
		printf("b[%d]\t", i);
	cout << "b[ ] " << endl;
	cout << "----------------------------" << endl;
	for (int i = n3 - 1; i >= 0; i--)
		printf("%d\t", c[i]);
	cout << "c[ ] " << endl;

	s3 = AtoS(c, n3);			 	// c[] --> s3
	cout << s3 << endl;

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值