C++练习分享_hw6.5_90行实现竖式加减

Date: 2020/10/22
Title: hw6_5_plus
Author: bearbenbin
Task:

  • To get a correct answer of addition of two overlong integers by simulating vertical addition.

Rules:

  1. The method of calculation should be simulation of vertical addition.
  2. All overlong integers including the result should be saved in an array of strings.

Result:

num0 = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+
num1 = -1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
=
result = 0
num0 = 1000
+
num1 = -1
=
result = 999
num0 = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+
num1 = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
=
result = 2469135780246913578024691357802469135780246913578024691357802469135780246913578024691357802469135780

Idea:
在这里插入图片描述
Code:

#include<iostream.h>
#include<string.h>
#define SIZE 103

int check(char *);
int preprocess(char *, char *);
void rightArrange(char *, char *);
int compare(char *, char *);
void calculating(char *, char *, char *);

int main(){
	char num[3][SIZE]={0}, *num0=num[0], *num1=num[1], *result=num[2];
	do{
		strcpy(num0,"");
		strcpy(num1,"");
		cout<<"num0 = ";
		cin>>num0;
		cout<<'+'<<endl<<"num1 = ";
		cin>>num1;
	}while( check(num0) || check(num1) );
	calculating(num0, num1, result);
	cout<<'='<<endl<<"result = "<<result<<endl;
	return 0;
}

int check(char *num){
	int fault=0;
	( (*num=='0' && *(num+1)!=0) || ((*num<'0' || *num>'9') && *num!='-') || (*num=='-' && *(num+101)!=0) || (*num!='-' && *(num+100)!=0) )? fault=1 : (void)1;
	for(int i=1; *(num+i)!=0; i++){
		( *(num+i)<'0' || *(num+i)>'9' )? fault=1 : (void)1;
	}
	return fault;
}

int preprocess(char *num0, char *num1){
	int rule=0;
	char temp[SIZE]={0};
	if(*num0=='-'){
		strcpy(temp, (num0+1));
		strcpy(num0, temp);
		rule=3;
		if(*num1=='-'){
			rule=1;
			strcpy(temp, (num1+1));
			strcpy(num1, temp);
		}
	}
	else
		(*num1=='-')? (rule=2, strcpy(temp, (num1+1)), strcpy(num1, temp)) : (void)1;
	int delta=strlen(num0)-strlen(num1);
	(delta != 0)? ( (delta>0)? (rightArrange(num0, num1)) : (rightArrange(num1, num0)) ) : (void)1;
	(compare(num0, num1) && rule>1)? (rule==2? rule=3 : rule=2) : (void)1; 
	return rule;
}

void rightArrange(char *num0, char *num1){
	char temp[SIZE]={0};
	for(unsigned int i=0; i<strlen(num0)-strlen(num1); i++){
		strcat(temp,"0");
	}
	strcat(temp, num1);
	strcpy(num1, temp);
}

int compare(char *num0, char *num1){
	int bigBro=0, len0=strlen(num0), len1=strlen(num1);
	if( len0==len1 && strcmp(num0,num1)<0 ){
		bigBro=1;
		char temp[SIZE]={0};
		strcpy(temp, num0);
		strcpy(num0, num1);
		strcpy(num1, temp);
	}
	return bigBro;
}

void calculating(char *num0, char *num1, char *result){
	int sum, add, a, b, c, d, rule=preprocess(num0, num1);
	strrev(num0);
	strrev(num1);
	(rule==0 || rule==1)? (a=d=1, b=c=0, add=0) : (a=c=-1, b=10, d=0, add=0);
	for(unsigned int i=0, e=1; i<strlen(num0)+e; i++){
		(i==strlen(num0))? sum=add : sum=(num0[i]-'0')+a*(num1[i]-'0')+b+add;
		sum>=10? ( add=d, result[i]=sum-10+'0', ((rule==0 || rule==1)? e=1 : e=0) ) : ( add=c, result[i]=sum+'0', e=0 );
	}
	while( *(result+strlen(result)-1)=='0' && *(result+strlen(result)-2)!=0 ){
		*(result+strlen(result)-1)=0;
	}
	((rule==1 || rule== 3) && *(result+strlen(result)-1)!='0')? (strcat(result, "-"), strrev(result)) : strrev(result);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值