#include <string>
using namespace std
inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1
if (str1.size()>str2.size()) return 1//长度长的整数大于长度小的整数
else if (str1.size()<str2.size()) return -1
else return str1.compare(str2)//若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2)
string ADD_INT(string str1,string str2)
string ADD_INT(string str1,string str2) {//高精度加法
int sign=1//sign 为符号位
string str
if (str1[0]=='-') {
if (str2[0]=='-') {
sign=-1
str=ADD_INT(str1.erase(0,1),str2.erase(0,1))
} else {
str=SUB_INT(str2,str1.erase(0,1))
}
} else {
if (str2[0]=='-') {
str=SUB_INT(str1,str2.erase(0,1))
} else { //把两个乎纤整数对齐,短整数前面加0补齐
string::size_type L1,L2
int i
L1=str1.size()
L2=str2.size()
if (L1<L2) {
for (i=1i<=L2-L1i++) str1="0"+str1
} else {
for (i=1i<=L1-L2i++) str2="0"+str2
}
int int1=0,int2=0//int2 记录进位
for (i=str1.size()-1i>=0i--) {
int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10
int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10
str=char(int1+'0')+str
}
if (int2!=0) str=char(int2+'0')+str
}
}
//运算后处理符号位
if ((sign==-1)&&(str[0]!='0')) str="-"+str
return str
}
string SUB_INT(string str1,string str2) {//高精度减法
int sign=1//芦掘sign 为符号位
string str
int i,j
if (str2[0]=='-') {
str=ADD_INT(str1,str2.erase(0,1))
} else {
int res=compare(str1,str2)
if (res==0) return "0"
if (res<岁哗仿0) {
sign=-1
string temp =str1
str1=str2
str2=temp
}
string::size_type tempint
tempint=str1.size()-str2.size()
for (i=str2.size()-1i>=0i--) {
if (str1[i+tempint]<str2[i]) {
j=1
while (1) {//zhao4zhong1添加
if (str1[i+tempint-j]=='0') {
str1[i+tempint-j]='9'
j++
} else {
str1[i+tempint-j]=char(int(str1[i+tempint-j])-1)
break
}
}
str=char(str1[i+tempint]-str2[i]+':')+str
} else {
str=char(str1[i+tempint]-str2[i]+'0')+str
}
}
for (i=tempint-1i>=0i--) str=str1[i]+str
}
//去除结果中多余的前导0
str.erase(0,str.find_first_not_of('0'))
if (str.empty()) str="0"
if ((sign==-1) &&(str[0]!='0')) str ="-"+str
return str
}
int main() {
char ch
string s1,s2,res
cout <<"请输入两个数:" <<endl
cin>>s1>>ch>>s2
cout <<SUB_INT(s1,s2) <<endl
return(0)
}
加法,多字节LINE0:PUSH ACC
PUSH R0
PUSH R1
PUSH R7
PUSH DPTR
MOV R0,#被减数首地址(所有地址假设低位仔侍在低地址)
MOV R1,#减数首地址
MOV DPTR.#差的首地址
CLR C
MOV R7,#多字节加法念缓吵字节数
LOOP:MOV A,@R0
SUBB A,@R1
MOVX @DPTR,A
INC R0
INC R1
INC DPTR
DJNZ R7,LOOP
MOV A,#00H
SUBB A,#00H
MOVX @DPTR,A
POP DPTR
POP R7
POP R1
POP R0
POP ACC
RET
以子程序形式给出子程序入口地址为:line0
乘法除法先在高字节运算,算法同理,如果对减法算法认可,可为你继续写哪李乘法除法子程序。
#include <stdio.h>#include <stdlib.h>
#include <烂宏string.h>
//mat97
//以下是双链表的节点结构,每个节点存储一个4位的数,比如1,0031,0056存入链表后就是1,31,56三个节,档没输出的时候再补0输出!
typedef struct node{
int n
struct node *next
struct node *prev
} node
node *p
char num1[1024],num2[1024]
int conv(char *a)
{
int n=0,i
for(i=0a[i]++i)
{
n*=10
n+=(a[i]-'0')
}
return n
}
int main()
{
char c[2]
int i,f
node *q
p=(node*)malloc(sizeof(node))
p->next=p->prev=0
q=p
num1[0]=num2[0]=','
printf("Enter num 1:\n")
scanf("%s",num1+1)
for(i=strlen(num1)i>=0--i)
{
if(num1[i]==',')
{
num1[i]=0
q->next=(node*)malloc(sizeof(node))
q->next->prev=q
q->next->next=0
q=q->next
q->n=conv(num1+i+1)
}
}
q->next=p
p->prev=q
printf("Enter op:\n")
scanf("%s",c)
*c=*c=='+'?0:1
printf("Enter num 2:\n")
scanf("%s",num2+1)
q=pf=0
if(!*c) //+
{
for(i=strlen(num2)i>=0--i)
{
if(num2[i]==',')
{
num2[i]=0
if(q->next==p)
{
q->next=(node*)malloc(sizeof(node))
q->next->next=p
q->next->prev=q
q->next->n=0
p->prev=q->next
}
q=q->next
q->n+=(conv(num2+i+1)+f)
if(q->n<10000)
f=0
else
{
f=1
q->n-=10000
}
}
}
if(f)
{
if(q->next==p)
{
q->next=(node*)malloc(sizeof(node))
q->next->next=p
q->next->prev=q
q->饥蠢册next->n=1
}
else
{
while(q->next!=p)
{
q=q->next
q->n+=1
if(q->n<10000)
{
f=0
break
}
else
{
q->n=0
f=1
}
}
if(f)
{
q->next=(node*)malloc(sizeof(node))
q->next->next=p
q->next->prev=q
q->next->n=1
}
}
}
printf("%d,",p->prev->n)
for(q=p->prev->prevq!=pq=q->prev)
printf("%04d,",q->n)
}
else //-
{
for(i=strlen(num2)i>=0--i)
{
if(num2[i]==',')
{
num2[i]=0
if(q->next==p)
{
q->next=(node*)malloc(sizeof(node))
q->next->next=p
q->next->prev=q
q->next->n=0
p->prev=q->next
}
q=q->next
q->n-=(conv(num2+i+1)+f)
if(q->n>=0)
f=0
else
{
f=1
q->n+=10000
}
}
}
if(f)
{
if(q->next==p)
{
q->n-=10000
}
else
{
while(q->next!=p)
{
q=q->next
q->n-=1
if(q->n>=0)
{
f=0
break
}
else
{
q->n+=10000
f=1
}
}
if(f)
{
q->n-=10000
}
}
}
printf("%d,",p->prev->n)
for(q=p->prev->prevq!=pq=q->prev)
printf("%04d,",q->n)
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)