您的位置:首页 > 其它

南邮 OJ 2098 3_A+B(III)

2015-08-08 11:19 330 查看


3_A+B(III)

时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte

总提交 : 203 测试通过 : 12

比赛描述

“不甘心!”,大魔王和阿汤哥的比试中又输了,他现在抓来了又胖又肥(好像一个意思)峰哥,这次他不会让他逃走了。

“啊,咯吱咯吱,想不到这个胖子还挺脆挺好吃的。”

输入

第一行,输入一个正整数 T (1<=T<=30)
然后有T行,每行两个整数 a 和 b (a和b的位数都保证在10000位以内~)

输出

对于每对 a和b,输出 a+b 的结果

样例输入

5

1 2

-5 3

1 -1

-1111111111111 2222222222222

23333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 -3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

样例输出

3

-2

0

1111111111111

20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

题目来源

NUPT

#include<iostream>
#define N 10005
using namespace std;

char num1
;
char num2
;
char result
;

void reverse(char num[], int len){
for(int i = 0; 2*i<len; ++i){
swap(num[i],num[len-1-i]);
}
}

//输入同时为正,结果肯定为正
void realadd(char *num1, char *num2, char *result){
int len1 = (int)strlen(num1), len2 = (int)strlen(num2);
int lenresult = max(len1,len2);
int i;
int carry = 0;
for(i=len1;i<lenresult;i++){
num1[i] = '0';
}
for(i=len2;i<lenresult;i++){
num2[i] = '0';
}
for(i=0;i<lenresult;++i){
result[i] = num1[i] - '0' + num2[i] + carry;
if(result[i]>'9'){
result[i] -= 10;
carry = 1;
}else{
carry = 0;
}
}
if(carry){
result[lenresult] = '1';
lenresult ++;
}
result[lenresult] = '\0';
}
//输入同时为正,num1>num2,结果一定为正
void realminus (char *num1,char *num2, char *result){
int len1 = (int)strlen(num1), len2 = (int)strlen(num2);
int i;
int borrow = 0;
for(i = 0; i<len2; ++i){
result[i] = num1[i]-num2[i]-borrow;
if(result[i]<0){
result[i] += 10;
borrow = 1;
}else{
borrow = 0;
}
result[i] += '0';
}
for(; i<len1; ++i){
result[i] = num1[i]-borrow-'0';
if(result[i]<0){
result[i] += 10;
borrow = 1;
}else{
borrow = 0;
}
result[i] += '0';
}
i--;
while(result[i]=='0'){
i--;
}
i++;
result[i] = '\0';
}

//输入同时为正,结果可正可负
void minus1 (char *num1,char *num2, char *result){
int len1 = (int)strlen(num1), len2 = (int)strlen(num2);
int lenresult,i;
int num1_minus_num2;			//标志num1-num2的正负
if(len1<len2){
num1_minus_num2 = -1;
}else if(len1>len2){
num1_minus_num2 = 1;
}else{
for(i=len1-1; i>=0 && num1[i]==num2[i]; --i){
;						//从最高位开始比较
}
if(i<0){
num1_minus_num2 = 0;	//一样大
}else if(num1[i]>num2[i]){
num1_minus_num2 = 1;	//num1大
}else{
num1_minus_num2 = -1;	//num2大
}
}
if(num1_minus_num2==0){
result[0] = '0';
result[1] = 0;
}else if(num1_minus_num2>0){
realminus(num1,num2,result);
}else{
realminus(num2,num1,result);
lenresult = (int)strlen(result);
result[lenresult] = '-';
lenresult++;
result[lenresult] = '\0';
}
}

void add (char *num1, char *num2, char *result){
int num1neg=0,num2neg=0,resultneg=0;
int i = 0, j = 0, len1 = (int)strlen(num1), len2 = (int)strlen(num2),lenresult;
reverse(num1,len1);
reverse(num2,len2);				//先翻转,这样有负号就不用移动了
if(num1[len1-1]=='-'){		//去掉负号,全部转化为正数
num1neg = 1;
len1--;
num1[len1] = '\0';
}
if(num2[len2-1]=='-'){
num2neg = 1;
len2--;
num2[len2] = '\0';
}
if(num1neg == num2neg){
resultneg = num1neg;	//同+或同-
realadd(num1,num2,result);
lenresult = (int)strlen(result);
if(resultneg){
result[lenresult] = '-';
lenresult++;
result[lenresult] = '\0';
}
}else{
if(num2neg){			//num1-num2
minus1(num1,num2,result);
}else{					//num2-num1
minus1(num2,num1,result);
}
}
lenresult = (int)strlen(result);
reverse(result,lenresult);
}

int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("\n%s %s",num1,num2);
add(num1,num2,result);
cout<<result<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: