2016华为机试题:大数相减

问题描述:

     输入一串以空格作为分割符的字符串,字符串由0~9组成,空格前面的部分字符串为大数A,空格后的部分字符串为大数B,用A-B,输出做差结果

     算例:输入 12345678 99999999

               输出:-87654321

下面是实现的程序,程序写的不好,有很多可以精简的地方,但结果都正确。

// 大数相减.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;

/*把A、B两个数的长度补齐成一样,以便相减*/
void buqi(int a[100], int b[100], int len1, int len2)
{
	int i;
	if (len1 > len2)
	{
		for (i = len1 - 1; i >= len1 - len2; i--)
		{
			b[i] = b[i - (len1 - len2)];

		}
		for (i = 0; i < len1 - len2; i++)
		{
			b[i] = 0;
		}
	}
	else if (len1 < len2)
	{
		for (i = len2 - 1; i >= len2 - len1; i--)
		{
			a[i] = a[i - (len2 - len1)];

		}
		for (i = 0; i < len2 - len1; i++)
		{
			a[i] = 0;
		}
	}
	else return;
}
/*减法函数,要求字符串一中的数,要大于字符串二中的数*/
void sub(char str1[100], char str2[100])
{
	int i = 0,len1,len2,maxlen;
	int a[100], b[100], c[100];
	len1 = strlen(str1);
	len2 = strlen(str2);
	maxlen = len1 > len2 ? len1:len2;
	while (str1[i] != '\0')
	{
		a[i] = str1[i] - '0';
		i++;
	}
	i = 0;
	while (str2[i] != '\0')
	{
		b[i] = str2[i] - '0';
		i++;
	}
	//for (i = 0; i < len1; i++)
	//	cout << b[i] << endl;
	//对齐  位补齐
	buqi(a, b, len1, len2);
	//从低位到高位作差
	for (i = maxlen - 1; i >= 0; i--)
	{
		if (a[i] >= b[i])
			c[i] = a[i] - b[i];
		else
		{
			a[i - 1] = a[i - 1]-1;
			a[i] += 10;
			c[i] = a[i] - b[i];
		}
	}
	i = 0;
	while (c[i++] == 0);//获得第一个不是0的数字的位置
	//cout <<maxlen<< i << endl;
	if (i == maxlen+1)  cout<<"0"<<endl;
	else
	{
		for (i = i - 1; i < maxlen; i++)
		{
			cout << c[i];
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	char str1[100], str2[100];
	int len1, len2;
	int i,k=0,bigflag;
	while (1)
	{
		cin >> str1;//输入
		cin >> str2;
		len1 = strlen(str1);
		len2 = strlen(str2);
		if (len1 > len2)
		{
			bigflag = 1;
		}
		else if (len1<len2)   bigflag = 2;
		else
		{
			for (i = 0; i < len1; i++)
			{
				if (str1[i]>=str2[i])     bigflag = 1;
				else if (str1[i] == str2[i])  continue;
				else if (str1[i] < str2[i])  bigflag = 2;
			}
		}

		if (bigflag == 1)  sub(str1, str2);
		else if (bigflag == 2)
		{
			cout << "-";
			sub(str2, str1);
		}
	}


	system("pause");
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值