C语言 超长整数加法

Python021

C语言 超长整数加法,第1张

以前我也做过一个大整数程序,2000!,不过那里面没有减法。做这个减法真让花时间啊。

#include<stdio.h>

#include<string.h>

#include<math.h>

#define MAX 4000/*数位上限*/

dd(char *a)

{

char t[MAX]

int i,j

for(i=0i<MAXi++)

{

if(a[i]==NULL)

{

for(j=0i>0j++,i--)

{

t[j]=a[i-1]

}

strncpy(a,t,j)

break

}

}

}

add1(char *a,char *b,int n,char *c)

{

int N

if(*a!=NULL&&*b!=NULL)

N=*a-'0'+*b-'0'+n

else if(*a==NULL&&*b!=NULL)

N=*b-'0'+n

else if(*a!=NULL&&*b==NULL)

N=*a-'0'+n

else

N=n

*c=(N%10)+'0'

N=N/10

if(*(a+1)!=NULL||*(b+1)!=NULL||N!=0)

{

add1(a+1,b+1,N,c+1)

}

}

addab(char *a,char *b,char *c)

{

dd(a)

dd(b)

dd(c)

add1(a,b,0,c)

dd(a)

dd(b)

dd(c)

}

d_(char *a)

{

int i

for(i=0a[i]!=NULLi++)

{

a[i]=a[i+1]

}

}

udg1(char *a,char *b,int n,char *c)

{

int N

if(*b==NULL)

{

N=*a-'0'-n

n=0

}

else

{

if(*a>=(*b+n))

{

N=*a-*b-n

n=0

}

else

{

N=*a+10-*b-n

n=1

}

}

*c=N+'0'

if(*(a+1)!=NULL)

udg1(a+1,b+1,n,c+1)

}

udg(char *a,char *b,char *c)

{

int i

if((strcmp(a,b)>0&&strlen(a)==strlen(b))||strlen(a)>strlen(b))

i=1

else if((strcmp(a,b)<0&&strlen(a)==strlen(b))||strlen(b)>strlen(a))

i=-1

else

i=0

dd(a)

dd(b)

dd(c)

if(i==1)

udg1(a,b,0,c)

else if(i==-1)

{

udg1(b,a,0,c)

for(i=0i<MAXi++)

{

if(c[i]==NULL)

{

c[i]='-'

break

}

}

}

else

*c='0'

dd(a)

dd(b)

dd(c)

}

add_(char *c)

{

int i

char t1,t2

t1=c[0]

t2=c[1]

c[0]='-'

for(i=1t1!='\0'i++)

{

c[i]=t1

t1=t2

t2=c[i+1]

}

}

main()

{

char a[MAX]={NULL},b[MAX]={NULL},c[MAX]={NULL}

printf("输入两个数:\n")

scanf("%s",a)

getchar()

scanf("%s",b)

getchar()

if(a[0]!='-'&&b[0]!='-')

{

addab(a,b,c)

}

else

{

if(a[0]=='-'&&b[0]!='-')

{

d_(a)

udg(b,a,c)

}

else if(a[0]!='-'&&b[0]=='-')

{

d_(b)

udg(a,b,c)

}

else

{

d_(b)

d_(a)

addab(a,b,c)

add_(c)

}

}

printf("%s\n",c)

getchar()

}

#include <stdio.h>#include <string.h>#define MAXLEN 1000void longadd(char* s1,char* s2 ,int* s3)

{int arr1[MAXLEN] int arr2[MAXLEN] int arr3[MAXLEN] int i //求字符串长度 倒序放在int 数组里面

int len1 = strlen(s1) for( i = 0i <len1i++)

{

arr1[i] = s1[len1-1-i] - '0'

}//求字符串长度 倒序放在int 数组里面

int len2 = strlen(s2) for( i = 0i <len2i++)

{

arr2[i] = s2[len2-1-i] - '0'

}//加法运算

for( i = 0i <MAXLENi++)

{

arr3[i] = arr1[i] + arr2[i]

}//数据处理 超过9的 进行取余 并且进位

for( i = 0i <MAXLENi++)

{if(arr3[i] >= 10)

{

arr3[i+1] += arr3[i] / 10

arr3[i] = arr3[i] % 10

}

s3[i] = arr3[i]

}return

}int main(int argc, char const *argv[])

{char buff1[MAXLEN] char buff2[MAXLEN] int arr[MAXLEN] puts("input 1:")

gets(buff1) puts("input 2:")

gets(buff2)

longadd(buff1,buff2,arr) //通过z变量的值过滤前面的0 倒序输出

int z = 0 for(int j =MAXLEN -1 j >= 0 j-- )

{if(z == 0)

{if(arr[j] != 0)

{printf("%d",arr[j])

z= 1

}

}else

{printf("%d",arr[j])

}

}//如果z值没有改变 则输出0

if( z== 0)

{printf("0\n")

}return 0

}