c语言 大整数加法

Python017

c语言 大整数加法,第1张

#include<stdio.h>

#include<string.h>

//翻转

void *reverse(char str[])

{

int len =strlen(str)

char*ps,*pe,tmp

ps=str,pe=str+len-1

for( ps<peps++,pe--)

{

tmp=*ps

*ps=*pe

*pe=tmp//need *

}

return str//dont't forget return str

}

//相加,并ascii码变为相应的数字

void add(char a[],char b[])

{

char *pl,*ps

int i,la,lb,len

la=strlen(a)

lb=strlen(b)

(la>lb)?(pl=a,ps=b,len=lb):(pl=b,ps=a,len=la)

for(i=0 i<len i++)

{

pl[i] += ps[i]-96//96=2*'0'

//don't need *

}

len = (la>lb)?la:lb

for( i<leni++)

{

pl[i] -= 48//don't need *

}

for(i=0 i<len i++)

{

if(pl[i] >9)

{

pl[i+1]++

pl[i] %= 10

}

}

if(pl[len] != 0)

{

printf("%d",pl[len])

}

for(i=len-1 i>=0 i--)

{

printf("%d",pl[i])

}

}

int main()

{

char a[200],b[200]

scanf("%s%s",a,b)

add(reverse(a),reverse(b))

return 0

}

//把各位的数码存入字符数组中,注意ASCAII码的转换

#include<stdio.h>

#include<string.h>

#include <conio.h>

int main()

{

int s,t,i,len1,len2

char s1[30],s2[30],n1[30],n2[30],sum[31]

//将字符串以数码形式按倒序存储于新字符串中,便于计算 

printf("input 2 num(小于10^40):\n")

scanf("%s%s",&s1,&s2)

len1=strlen(s1)

len2=strlen(s2)

t=0

for(i=len1i>=0i--)n1[t++]=s1[i-1]-48

t=0

for(i=len2i>=0i--)n2[t++]=s2[i-1]-48

//高位补0 

if(len1>len2)

{

n1[len1]=0

for(i=len2i<len1i++)n2[i]=0

}

if(len1<len2)

{

n2[len2]=0

for(i=len1i<len2i++)n1[i]=0

}

//计算 

t=0

s=0

for(i=0i<(len1>len2?len1:len2)i++)

{

s=n1[i]+n2[i]+t//s为数码之和 

sum[i]=s%10 //sum[i]为该位上的数码 

t=s/10//t为进位 

s=0

}

//输出 

putchar(10)

if(t>0)

{

sum[i]=t

for(s=is>=0s--)printf("%c",sum[s]+48)

}

else

{

for(s=i-1s>=0s--)printf("%c",sum[s]+48)

}

    getch()

}

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#define N 100

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

{

char arr[N] = {}

gets(arr)

char brr[N] = {}

gets(brr)

int len1,len2,i = 0,j = 0

len1 = strlen(arr)

len2 = strlen(brr)

int len = len1>len2?len1:len2

/*  c99之后数组初始化支持整型表达式,称为可变长数组,但按照c89的标准是不对的

int num1[len]//将字符串转换成翻转的整型数组

int num2[len]

*/

int* num1 = (int*)malloc(len*sizeof(int))

int* num2 = (int*)malloc(len*sizeof(int))

for (i = 0i <leni++)

{

num1[i] = i<len1 ? arr[len1-i-1]-'0':0

}

for (j = 0j <lenj++)

{

num2[j] = j<len2 ? brr[len2-j-1]-'0':0

}

//int sum[len]//定义和数组

int* sum = (int*)malloc(len*sizeof(int))

int flag=0//设进位符

for (i = 0i <leni++)

{

sum[len-1-i] = (num1[i]+num2[i]+flag)%10

flag = (num1[i]+num2[i]+flag)/10

}

if (flag == 1) printf("1")   //如果最高位有进位 则输出一个1

for (i = 0i <leni++)

{

printf("%d",sum[i])

}

printf("\n")

free(num1)

free(num2)

free(sum)

num1 = NULL

num2 = NULL

sum = NULL

return 0

}

扩展资料:

gets()函数用法

gets是从标准输入设备读字符串函数。

函数原型:char*gets(char*str);

功能为:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。

注意:不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。使用时需要包含stdio.h头文件

参数

str为字符串指针,用来存放读取到的数据。

返回值

读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。