博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带符号的整数做减法
阅读量:4553 次
发布时间:2019-06-08

本文共 2976 字,大约阅读时间需要 9 分钟。

ContractedBlock.gif
ExpandedBlockStart.gif
View Code
 
#include
<
iostream
>
using
namespace
std;
char
a[
1001
] ;
char
x_a[
1001
] , y_b[
1001
] ;
char
xx[
1001
] , yy[
1001
];
char
x1[
1001
] , y1[
1001
];
int
Lx , Ly ;
int
sum[
1001
] ;
int
num ;
int
sign
=
0
;
int
mark_x , mark_y ;
int
x[
1001
],y[
1001
];
void
Init_A()
//
将字符转化为数字
{
int
i;
for
( i
=
0
; i
<
Lx ; i
++
) x[i]
=
x_a[i]
-
'
0
'
;
for
( i
=
0
; i
<
Ly ; i
++
) y[i]
=
y_b[i]
-
'
0
'
;
}
void
Init_S()
{
int
i;
for
( i
=
0
; i
<
Lx ; i
++
) x1[Lx
-
i
-
1
]
=
x_a[i] ;
for
( i
=
0
; i
<
Ly ; i
++
) y1[Ly
-
i
-
1
]
=
y_b[i];
strcpy(x_a , x1);
strcpy(y_b , y1);
Init_A();
}
void
Change()
//
交换x,y,如果x<y;
{
strcpy( a , y_b) ;
strcpy( y_b , x_a ) ;
strcpy( x_a , a ) ;
int
temp
=
Lx ;
Lx
=
Ly ;
Ly
=
temp;
}
void
Cmp( )
//
保证x>=y
{
int
i;
if
(Lx
<
Ly) { sign
=
1
; Change();}
if
(Lx
==
Ly)
{
for
( i
=
0
; i
<
Lx ; i
++
)
if
(x_a[i]
<
y_b[i])
break
;
if
( i
!=
Lx )
{
sign
=
1
;
Change();
}
}
}
void
Add()
//
高精度加法
{
num
=
0
;
int
i , j , flag
=
0
;
for
( i
=
Lx ,j
=
Ly ; i
>=
Lx
-
Ly , j
>=
0
; i
--
, j
--
)
{
sum[num
++
]
=
( x[i]
+
y[j]
+
flag)
%
10
;
flag
=
( x[i]
+
y[j]
+
flag)
/
10
;
}
for
(i
=
Lx
-
Ly
-
1
; i
>=
0
; i
--
)
{
sum[num
++
]
=
( x[i]
+
flag )
%
10
;
flag
=
( x[i]
+
flag )
/
10
;
}
while
(flag)
{
sum[num
++
]
=
flag
%
10
;
flag
/=
10
;
}
}
void
Sub()
//
高精度减法
{
num
=
0
;
int
i ;
for
(i
=
0
;i
<
Lx; i
++
)
{
sum[i]
+=
x[i]
-
y[i];
if
(sum[i]
<
0
)
{
sum[i
+
1
]
--
;
sum[i]
+=
10
;
}
}
while
( Lx
>
1
&&
sum[Lx
-
1
]
==
0
) Lx
--
;
num
=
Lx;
}
void
PrintAdd()
{
int
i;
for
(i
=
num
-
1
;i
>
0
;i
--
)
printf(
"
%d
"
,sum[i]);
}
void
PrintSub()
{
int
i;
for
(i
=
num
-
1
;i
>=
0
; i
--
)
printf(
"
%d
"
,sum[i]);
}
int
main()
{
while
(scanf(
"
%s%s
"
,xx, yy)
!=
EOF)
{
int
L1
=
strlen(xx);
int
L2
=
strlen(yy);
num
=
0
; sign
=
0
;
memset( sum ,
0
,
sizeof
(sum));
memset( x ,
0
,
sizeof
(x));
memset( y ,
0
,
sizeof
(y));
memset( x_a ,
0
,
sizeof
(x_a));
memset( y_b ,
0
,
sizeof
(y_b));
memset( x1 ,
0
,
sizeof
(x1));
memset( y1 ,
0
,
sizeof
(y1));
mark_x
=
mark_y
=
0
;
Lx
=
L1;
Ly
=
L2;
int
i;
if
( xx[
0
]
==
'
-
'
||
xx[
0
]
==
'
+
'
)
{
if
(xx[
0
]
==
'
-
'
) mark_x
=
1
;
for
( i
=
1
; i
<
Lx ; i
++
) x_a[i
-
1
]
=
xx[i];
Lx
=
Lx
-
1
;
}
if
(xx[
0
]
!=
'
-
'
&&
xx[
0
]
!=
'
+
'
)
{
for
(i
=
0
;i
<
Lx;i
++
) x_a[i]
=
xx[i];
}
if
(yy[
0
]
==
'
-
'
||
yy[
0
]
==
'
+
'
)
{
if
(yy[
0
]
==
'
-
'
) mark_y
=
1
;
for
(i
=
1
; i
<
Ly ; i
++
) y_b[i
-
1
]
=
yy[i];
Ly
=
Ly
-
1
;
}
if
(yy[
0
]
!=
'
-
'
&&
yy[
0
]
!=
'
+
'
)
for
(i
=
0
;i
<
Ly;i
++
) y_b[i]
=
yy[i];
if
(mark_x
==
0
)
{
if
( mark_y
==
0
)
{
Cmp();
Init_S();
Sub();
if
(sign
==
1
) printf(
"
-
"
);
PrintSub();
}
if
(mark_y
==
1
)
{
Cmp();
Init_A();
Add();
PrintAdd();
}
}
if
(mark_x
==
1
)
{
if
( mark_y
==
0
)
{
Cmp();
Init_A ();
Add();
printf(
"
-
"
);
PrintAdd();
}
if
(mark_y
==
1
)
{
Cmp();
Init_S();
Sub();
if
(sign
==
0
) printf(
"
-
"
);
PrintSub();
}
}
printf(
"
\n
"
);
}
return
0
;
}

转载于:https://www.cnblogs.com/FCWORLD/archive/2011/05/18/2050226.html

你可能感兴趣的文章
网络流 Edmons-Karp 算法讲解
查看>>
「NOIP2018模拟9.10」公约数 - 找规律 - gcd
查看>>
使用java理解程序逻辑(15)
查看>>
bzoj 1879 状压dp
查看>>
python 一些特殊用法和坑
查看>>
WIFI密码破解全攻略
查看>>
c++string各种函数
查看>>
errno.h含义
查看>>
字典树(模型体)
查看>>
盒模型详解
查看>>
bzoj2157 旅游
查看>>
bzoj5016 [Snoi2017]一个简单的询问
查看>>
poj2417 bzoj3239 Discrete Logging(bsgs)
查看>>
UVa10054 - The Necklace(欧拉回路【输出带来的麻烦)
查看>>
string和stringbuffer的区别 集合的作用 ArrayList vector linklist hashmap hashtable collection和collections...
查看>>
6月27日 ajax
查看>>
iOS开发之画图板(贝塞尔曲线)
查看>>
4嵌入式作业io
查看>>
IntelliJ Idea编译报错:javacTask: 源发行版 1.7 需要目标发行版 1.7
查看>>
Cognos中新建SQLserver数据源的步骤
查看>>