您的位置:首页 > 其它

SZU:B47 Big Integer I

2013-07-26 13:22 274 查看

Judge Info

Memory Limit: 32768KB

Case Time Limit: 10000MS

Time Limit: 10000MS

Judger: Normal

Description

Please calculate the answer of A+B and the answer of A-B, both A and B are integer.

Input

The first line of input contains

, the number of test cases. There is only line for each test case. It contains two integers

.

Output

For each test case, output two lines A+B and A-B.

Sample Input

3
1 2
1 1
-1 -1


Sample Output

3
-1
2
0
-2
0

题解:

1. 调试了很多遍,WA,之后朋友用python 测试很多大数据,我都测试了,数据正常,但还是WA,问了cxc,才发现,擦擦,尼玛,爆粗有木有? 调代码调了四个多小时只是没考虑前导0 ?带前导0也算神马整数 , -000001 是 -1 0000002 是 2 , 哪有这么无语的数据,擦擦!!

2. 第二次调试发现前导0去掉了。但是忽略了一个重要的数据,妹的 -00000 减去 +0000000 等于 -0 的有木有? 又单独考虑0的符号问题,最终AC。

虽然我代码写的很啰嗦,也很难懂,给自己做个留念吧。

#include <stdio.h>
#include <string.h>

#define max(a, b) ((a) >= (b) ? (a) : (b))

char A[1012];
char B[1012];
int  C[1012];
int mark;

char *revstr(char *str, size_t len)
{

char    *start = str;
char    *end = str + len - 1;
char    ch;

if (str != NULL)
{
while (start < end)
{
ch = *start;
*start++ = *end;
*end-- = ch;
}
}
return str;
}

void add(char A[], char B[]){

int i, lenA, lenB, len;
memset(C,0,sizeof(C));

lenA = strlen(A);
lenB = strlen(B);
len = max(lenA, lenB);

revstr(A,lenA);
revstr(B,lenB);

A[lenA] = '0';
B[lenB] = '0';

for(i=0;i<len+1;i++){

C[i] = (A[i] - '0') + (B[i] - '0') ;
}

for(i=0;i<len+1;i++){
if(C[i] > 9 ){
C[i]%=10;
C[i+1]++;
}
}

if(mark == 1) putchar('-');
if(C[len]==0){
for(i=len-1;i>=0;--i)
printf("%d", C[i]);
printf("\n");
}

else {
for(i=len;i>=0;--i)
printf("%d", C[i]);
printf("\n");
}
A[lenA] = '\0';
B[lenB] = '\0';
revstr(A,lenA);
revstr(B,lenB);

}

void minus(char A[], char B[]){

int i, lenA, lenB, len;
memset(C,0,sizeof(C));

lenA = strlen(A);
lenB = strlen(B);
len = max(lenA, lenB);
revstr(A,lenA);
revstr(B,lenB);

A[lenA] = '0';
B[lenB] = '0';

for(i=0;i<len;i++){

C[i] = (A[i] - '0') - (B[i] - '0') ;
}

for(i=0;i<len;++i){
if(C[i] <0 ){
C[i] += 10;
C[i+1]--;
}
}

if(mark == 1) putchar('-');

for(;C[len]==0;--len)
if(len==0)
break;
for(i=len;i>=0;--i)
printf("%d", C[i]);
printf("\n");

A[lenA] = '\0';
B[lenB] = '\0';
revstr(A,lenA);
revstr(B,lenB);
}

int main(int argc, char const *argv[])
{
int t, i, lenA, lenB, len, Amark, Bmark;

scanf("%d", &t);
while(t--){

mark = 0;
Amark = 0;
Bmark = 0;

memset(A,'0',sizeof(A));
memset(B,'0',sizeof(B));

scanf("%s", A);
scanf("%s", B);

lenA = strlen(A);
lenB = strlen(B);

int len;
len = max(lenA, lenB);

if(A[0] == '-'){
for(i=1;i<lenA;++i)
A[i-1]=A[i];
A[i-1]='\0';
A[i] = '0';
Amark = 1;
}

if(B[0] == '-'){
for(i=1;i<lenB;++i)
B[i-1]=B[i];
B[i-1]='\0';
B[i] = '0';
Bmark = 1;
}

while(A[0]== '0'){
for(i=0;i<lenA;++i)
A[i]=A[i+1];
A[lenA]='0';
}

if(A[0]=='\0'){
A[0]='0';
A[1]='\0';
}

while(B[0]== '0'){
for(i=0;i<lenB;++i)
B[i]=B[i+1];
B[lenB]='0';

}

if(B[0]=='\0'){
B[0]='0';
B[1]='\0';
}

if(A[0] == '0' && B[0] == '0'){
printf("0\n");
printf("0\n");
continue;
}

lenA = strlen(A);
lenB = strlen(B);
len = max(lenA, lenB);

lenA = strlen(A);
lenB = strlen(B);

if(Amark == 0 && Bmark == 0 ){
mark = 0;
add(A,B);

if(lenA>lenB){
mark = 0;
minus(A,B);
}
else if(lenA < lenB){
mark = 1;
minus(B,A);
}
else {
if(strcmp(A,B)>0){
mark = 0;
minus(A,B);
}
else if(strcmp(A,B)<0){
mark = 1;
minus(B,A);
}
else {mark =0 ;minus(A,B);}
}
continue;
}

if(Amark == 1 && Bmark ==1){

mark = 1;
add(A,B);

if(lenA>lenB){
mark = 1;
minus(A,B);
}
else if(lenA<lenB){
mark = 0;
minus(B,A);
}
else {
if(strcmp(A,B)>0){
mark = 1;
minus(A,B);
}
else if(strcmp(A,B)<0){
mark = 0;
minus(B,A);
}
else{
minus(A,B);
}
}
continue;
}

if(Amark == 1 && Bmark == 0){
if(lenA>lenB){
mark = 1;
minus(A,B);
}
else if(lenA<lenB){
mark = 0;
minus(B,A);
}
else {
if(strcmp(A,B)>0){
mark = 1;
minus(A,B);
}
else if(strcmp(A,B)<0){
mark = 0;
minus(B,A);
}
else{
mark = 0;
minus(A,B);
}
}

mark = 1;
add(A,B);
continue;
}

if(Amark == 0 && Bmark == 1){
if(lenA>lenB){
mark = 0;
minus(A,B);
}
else if(lenA<lenB){
mark = 1;
minus(B,A);
}
else{
if(strcmp(A,B)>0){
mark = 0;
minus(A,B);
}
else if(strcmp(A,B)<0){
mark = 1;
minus(B,A);
}
else {
mark = 0;
minus(A,B);
}
}
mark = 0;
add(A,B);
continue;
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: