C++——大数计算(相加)

大数计算,即对两个限定长度的数字做运算。因为限定长度可以是10,20,也可以是100,200…就别想着用long long或者其他分配空间很大的数字类型来做了,老老实实用char数组吧。

因为两个数字长度可能不一样,我编写了一个判断语句,如果第一个数字的长度小于第二个,则两个数做一下交换,并向右对齐较短的数字,前面用’0’补齐。如果两个数字长度相等,那就不用进行交换,补齐操作。

有一个点卡了一段时间,后来发现给字符数组元素赋值时,“=‘0’”被我写成“=0”了,以后要注意一下。

#include 
#include 		//需要得到字符串长度 
using namespace std;

int main()
{
    char num1[100], num2[100], tch[100], num3[100];	//num1和num2表示要相加的两个数,num3表示结果
													//tch用于交换num1和num2,使num1长度不小于num2 
    cout << "请输入两个数字:";
	cin >> num1 >> num2;	//输入要相加的两个数 
    int flag = 0;	//进位标志,flag为1表示有进位,0表示无进位 
	int len1 = strlen(num1), len2 = strlen(num2), tlen;	//len1和len2表示两个数字的长度
														//tlen用于交换len1和len2 
	
	if(len1 < len2)	//如果num1长度小于num2长度,交换,使num1长度不小于num2长度 
	{
		strcpy(tch, num1);
		strcpy(num1, num2);
		strcpy(num2, tch);
		tlen = len1;
		len1 = len2;
		len2 = tlen;
	}
	
	if(len1 > len2)
	{
		for(int i = 0; i < len2; i++)	//将num2向右对齐,执行len2遍 
		{
			num2[len1-1-i] = num2[len2-1-i];
		}
		for(int i = 0; i < len1 - len2; i++)	//将num2前面空白部分用0补齐,执行len1-len2遍 
		{
			num2[i] = '0';
		}
	}
	
    for(int i = len1 - 1; i >= 0; i--) 	//和算式一样,先从最右边开始计算 
    {
        int temp1 = num1[i] - '0';	//将字符'1'变成数字1
		int temp2 = num2[i] - '0';
        int temp3 = temp1 + temp2 + flag;	//flag是进位标志,有可能是0或1,初始状态是0
        flag = 0;
        if(temp3 >= 10)
		{
            temp3 -= 10;	//如果需要进位,记录进位,去掉十位数(即-10),保留个位数 
            flag = 1;
        }
        num3[i] = (temp3 + '0');	//将数字1变成字符'1' 
    }
    cout << "两数之和为:";
	if(flag == 1)	//flag为1表示最高位相加后有进位,最高位一定是1 
		cout << '1';
    cout << num3;
    return 0;
}

两数长度不相等也可能造成最高位有进位,这里就不一一罗列了。

请输入两个数字:162462897321 25895614	//len1>len2
两数之和为:162488792935

请输入两个数字:178952617462 368621740529	//len1=len2,最高位无进位
两数之和为:547574357991

请输入两个数字:841236521579 351586154267	//len1=len2,最高位有进位
两数之和为:1192822675846

请输入两个数字:8621561452 179221462598	//len1
两数之和为:187843024050

氷鸢鸢鸢
2020.7.11

你可能感兴趣的:(C++)