【华为OJ】超长正整数相加

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/winnie_tan/article/details/52416826

输入:两个超长正整数  (string类型)

输出:两数之和


#include<iostream>
#include<string>
using namespace std;

int main()
{
	string str1,str2,addend,augend;
	int str3[1000];
	cin >> str1>>str2;
	int length1 = str1.size();
	int length2 = str2.size();
	int maxi, mini;
	if (length1 < length2)
	{
		addend = str2;
		augend = str1;
		maxi = length2;
		mini = length1;
	}
	else
	{
		addend = str1;
		augend = str2;
		maxi = length1;
		mini = length2;
	}
	int arr1[1000],arr2[1000];
	for (int i = 0;i < maxi;i++)
	{
		arr1[i] = addend[maxi - i - 1] - '0';
		//cout << arr1[i];
	}
	for (int i = 0;i < mini;i++)
	{
		arr2[i] = augend[mini - i - 1] - '0';
	}
	for (int i = 0;i < maxi+1;i++)
		str3[i] = 0;
	
	for (int i = 0;i < mini;i++)
	{
		str3[i] += arr1[i] + arr2[i];
		while (str3[i] > 9)
		{
			str3[i]-=10;
			str3[i + 1]++;
		}
	}
	for (int i = mini;i < maxi;i++)
	{
		str3[i] += arr1[i];
		while (str3[i] > 9)
		{
			str3[i] -= 10;
			str3[i + 1]++;
		}
	}
	if (str3[maxi] != 0)cout << str3[maxi];
	for (int i = maxi-1;i >= 0;i--)
		cout << str3[i];
	return 0;
}

用的方法非常啥,轻喷!先是比较了两个数的长度,因为对于短的那一部分属于两个字符以及后位进上来的项相加,而对于长的多出的部分就是长的和后位进上来的项相加。

为了理清思路,都将其转换成了整数数组,因为对于字符串而言,输入的str[0]在计算中其实是最高位,这里可以用STL的,直接reverse就好了。

然后因为代码质量不是很好,测试花了很长时间来进行修改。如果有好的算法再来补充。

展开阅读全文

超长正整数减法,错在哪里???

08-13

哪一步没有考虑到,或者有什么更好的算法???rn望高人指点~~~~rnrnrn/*rn【问题描述】rn编写程序实现两个超长正整数(每个最长80位数字)的减法运算。rn rn【输入形式】rn从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。rn1. 第一行是超长正整数A;rn2. 第二行是超长正整数B;rn rn【输出形式】 rn输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。rn要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。rn 【输入样例】rn rn234098rn134098703578230056rn rn【输出样例】rn -134098703577995958rn【样例说明】rn进行两个正整数减法运算, 234098 -134098703578230056 = -134098703577995958。rn*/rn#include rn#include rnvoid cancel (char s[]);rnvoid reverse (char s[]);rnrnint main()rnrn char a[100]='\0',b[100]='\0',temp[100]='\0';rn int len_a,len_b;rn int i;rn gets(a);rn gets(b);rnrn //去掉数组前面的0rn cancel (a);rn cancel (b);rnrn len_a=strlen(a);rn len_b=strlen(b);rnrn //使前一个数大于后一个数,并输出负号rn if (len_a=b[i])rn if (b[i]==0)rn a[i]=a[i];rn elsern a[i]=a[i]-b[i]+'0';rn rn elsern a[i]=a[i]+10-b[i]+'0';rn a[i+1]=a[i+1]-'1';//▲▲▲这一步好像不太对???▲▲▲rn rn reverse (a);rn cancel (a);rnrn printf ("%s\n",a);rn return 0;rnrnrn//删除数组前面的0rnvoid cancel (char s[])rn int len_s,i,j;rn len_s=strlen(s);rn for (i=0;i 论坛

没有更多推荐了,返回首页