一、题目
题目
长整数 10
结构
字节数组,十进制,补码
回传方式
数组基址
操作
函数:输入、输出、加、减、乘、除、关系运算、求余
二、概要设计
1.设计要点
⑴符号内嵌在最高字节中 0-9 为无符号或正数,10-19 为负数;
⑵使用补码:取反加一,正数和负数都一样,负数的反码为相对应的正数的补码按位求反,
最后末尾加一得到;
⑶做四则运算:加法符号位直接参与运算,减法需要对减数求补码,再求和,乘法需要将负
数校正。
2.数据结构
typedef char Long[n+1];
符号位
Long
a
a[n]
a[n-1]
……
a[1]
a[0]
例如,n=20 时,±123456789 的存储格式分别为
0
0
0
0
0
0
0
0
0
0
0
0
1
2
3
4
5
6
7
8
9
19
9
9
9
9
9
9
9
9
9
9
9
8
7
6
5
4
3
2
1
1
取值范围是-10
20
~10
20
-1
3. 基本操作:
void In(L a)
void Out(L a)
void Add(L a,L b,L c)
void Sub(L a,L b,L c)
void Mul(L a,L b,L c)
bool eq(L a,L b)
bool dx(L a,L b)
三、源程序(附测试数据)
#include<iostream>
using namespace std;
const int n=20;
typedef char L[n];
void bm(L l){
l[n-1]=19-l[n-1];
for(int i=n-2;i>=0;i--)
l[i]=9-l[i];
l[0]++;
for(i=0;i<n-1;i++)
if(l[i]>9)l[i]-=10,l[i+1]++;
}
void In(L a){
char c; int i,j; bool f=0;
while(scanf("%c",&c),c==32||c==9||c==10);//跳过分隔符,空格,换区
if(c=='-')f=1,scanf("%c",&c);//遇到负号
else if(c=='+')scanf("%c",&c);//遇到正号(忽略)
for(i=n-1;'0'<=c&&c<='9'&&i>=0;i--)
a[i]=c-48,scanf("%c",&c);//逐位入十进制数
for(j=0,i++;i<n;j++,i++)a[j]=a[i];//右对齐
while(j<n)a[j++]=0;//左补零
if(f)bm(a);