求 大整数减法 的代码 C或C++

求 大整数减法 的代码 C或C++,第1张

#include <iostream>

#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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12461236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存