当前位置:首页 » 编程语言 » 超长整数加法c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

超长整数加法c语言

发布时间: 2023-01-08 10:41:38

❶ 在c语言环境下实现长整数的加减法运算

#include <stdio.h>
#include <string.h>

#define MAX 100 /*位数*/
typedef struct {
int a[MAX];
int b[MAX];
int s[MAX+1];
} high;

void init(high *x,char *a,char *b)
{
int i,len;
len=strlen(a);
for (i = 0; i<MAX; i++) {
x->a[i]=x->b[i]=x->s[i]=0;
}
x->s[MAX]=0;
for (i=0; i<len; ++i) {
x->a[MAX+i-len]=a[i]-48;
}
len=strlen(b);
for (i=0; i<len; ++i) {
x->b[MAX+i-len]=b[i]-48;
}
}
int plus(high *x)
{
int i;
for (i=MAX-1; x->a[i]||x->b[i]; --i) {
x->s[i+1]+=(x->a[i]+x->b[i]);
x->s[i]+=x->s[i+1]/10;
x->s[i+1]%=10;

}
return (MAX-i);
}
void prt(high *a,int len)
{
int i;
for (i=MAX-len+1; i<=MAX; i++) printf("%d",a->s[i]);

}
int main(void)
{
char a[MAX+1],b[MAX+1];
int len;
high sp;
scanf("%[0123456789]",a);
fflush(stdin);
scanf("%[1234567890]",b);
init(&sp,a,b);
len=plus(&sp);
prt(&sp,len);
return 0;
}

❷ C语言 超长整数加法

模拟!就是实现你做加法的过程,一位一位算,注意进位就行了

❸ 用c语言实现超长整数的加法运算

#include "stdio.h"
int sum(int a[],int b[],int c[])
{
int i=0,j=0,f=0;
for(;i<21;i++)
{
j=a[i]+b[i]+j;
if(j!=0) f=i;
c[i]=j%10000;
j=j/10000;
}
c[i]=j;
return f;
}
void get(int a[])
{
int n,i,j;
scanf("%d",&n);
j=(n-1)/4;
switch (n%4)
{
case 3:scanf("%3d",&a[j]);break;
case 2:scanf("%2d",&a[j]);break;
case 1:scanf("%1d",&a[j]);break;
case 0:scanf("%4d",&a[j]);break;
}

for(i=j-1;i>=0;i--)
scanf("%4d",&a[i]);
}
void main()
{
static int a[20],b[20],c[21],i,n,f;
char d[80];
get(a);
get(b);
f=sum(a,b,c);
for(i=f;i>=0;i--)
printf("%4d",c[i]);
}

❹ C语言中怎么实现两个超大整数的相加减乘除

#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 = 0; i < len; i++)

{

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

}

for (j = 0; j < len; j++)

{

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 = 0; i < len; i++)

{

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 = 0; i < len; i++)

{

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

}

printf(" ");

free(num1);

free(num2);

free(sum);

num1 = NULL;

num2 = NULL;

sum = NULL;

return 0;

}

(4)超长整数加法c语言扩展阅读:

gets()函数用法

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

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

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

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

参数

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

返回值

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

❺ 关于c语言超长正整数相加的问题,。求高手指教!!!!!

/*这里是头文件BigInt.h*/
class bigint
{
struct node //节点
{
char n;
node *next;
};
node *head,*end,*temp;//头结点,尾节点,临时节点
void addhead(char n);//增加头结点
void addend(char n);//增加尾节点
public:
bigint();
~bigint();
void getnum();//获取大整数
void dispnum();//显示
void add(const bigint &bignum1,const bigint &bignum2);

void sub(const bigint &bignum1,const bigint &bignum2);

void mul(const bigint &bignum1,const bigint &bignum2);
};

/*主文件BigInt.cpp*/

#include<iostream.h>
#include<stdio.h>
#include"BigInt.h"
#include <windows.h>

bigint::bigint()
{
head=end=temp=NULL;
}

//析构
bigint::~bigint()
{
node *nextnode;
if (head==NULL)
return;
temp=head;
while (temp) //删除节点
{
nextnode=temp->next;
delete temp;
temp=nextnode;
}
head=end=temp=NULL;
}

void bigint::addhead(char n)//增加头结点
{
temp=new node;
temp->n=n;
temp->next=NULL;
if (!head)
{
head=end=temp;
temp->next=NULL;
}
else
{
temp->next=head;
head=temp;
}
}

void bigint::addend(char n)//增加尾节点
{
temp=new node;
temp->n=n;
temp->next=NULL;
if (!end)
{
head=end=temp;
temp->next=NULL;
}
else//链表非空时,尾节点的指针指向临时节点,然后把临时节点赋给尾节点
{
end->next=temp;
end=temp;
}
}

void bigint::getnum()//获取大整数
{
char key;
while ((key=getchar())!=10)//判断是否是回车
{
addhead(key);
}
}

void bigint::dispnum()//显示大整数
{
if (!head)//空链表时的显示
cout<<"错误!"<<endl;
else
{
node *tempnode;
tempnode=head;
while (tempnode)
{
cout<<tempnode->n;
tempnode=tempnode->next;
}
cout<<endl;
}
}

//加法
void bigint::add(const bigint &bignum1,const bigint &bignum2)
{

node *temp1,*temp2;
int rest=0,num=0;
temp1=bignum1.head;//临时节点指针1指向第一个大整数的头结点
temp2=bignum2.head;//临时节点指针2指向第二个大整数的头结点
while (temp1&&temp2)
{
num=(int(temp1->n)-48)+(int(temp2->n)-48)+rest;
if (num>9)
{
num=num-10;
rest=1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;//节点下移
temp2=temp2->next;
}
if (temp2) temp1=temp2;//当一个链表到达尾部时,另一个链表继续循环
while (temp1)
{
num=(int(temp1->n)-48)+rest;
if (num>9)
{
num=num-10;
rest=1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
}
if (rest)//判断循环结束后是否有进位
addhead(rest+48);
}

void bigint::sub(const bigint &bignum1,const bigint &bignum2) //减法
{
bigint tempa,tempb,tempc;
node *temp1,*temp2,*temp3,*temp4,*temp5;
int num1_len=0,num2_len=0;//统计两个大整数的长度
int num=0,rest=0;
temp1=bignum1.head;
temp2=bignum2.head;
while (temp1)
{num1_len++;temp1=temp1->next;}
while (temp2)
{num2_len++;temp2=temp2->next;}
temp1=bignum1.head;
temp2=bignum2.head;
if (num1_len>num2_len)//当第一个大整数比第二个大整数长时,结果为正数
{
while (temp1&&temp2)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
while (temp1)
{
num=(int(temp1->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
}
}
else if (num1_len<num2_len)//第二个大整数比第一个大整数长,则结果为负数
{
temp3=temp2;
temp2=temp1;
temp1=temp3;
while (temp1&&temp2)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
while (temp1)
{
num=(int(temp1->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
}
addhead('-');
}
else//一样长时,从头位往后依次判断各个对应位数字的大小,以判断结果的正负
{
temp1=bignum1.head;
while (temp1)
{tempa.addhead(temp1->n);temp1=temp1->next;}
temp4=tempa.head;
temp2=bignum2.head;
while (temp2)
{tempb.addhead(temp2->n);temp2=temp2->next;}
temp5=tempb.head;
temp1=bignum1.head;
temp2=bignum2.head;
while (temp4->n==temp5->n)//相同时的情况
{
temp4=temp4->next;
temp5=temp5->next;
if (temp4==NULL) break;
}
if (temp4==NULL)
addend('0');
else if (temp4->n>temp5->n)//结果为正
{
while (temp1)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
}
else //结果为负
{
temp3=temp1;
temp1=temp2;
temp2=temp3;
while (temp1)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
addhead('-');//向头结点增加负号
}
}
}

//乘法
void bigint::mul(const bigint &bignum1,const bigint &bignum2)
{
bigint Tempa,Tempb,result;
node *temp,*temp1,*temp2,*tempa,*tempb;
int num=0,num2=0,i=0,k=0,rest,rest2;
temp1=bignum1.head;
temp2=bignum2.head;
while (temp2)
{
rest=0;rest2=0;//归零
if (result.head!=NULL)
{result.head=result.end=NULL;}//清空结果链表
while (temp1!=NULL)//用第二个大整数的一位与第一个大整数的每一位相乘,结果存入临时链表Tempa中
{
num=(int(temp1->n)-48)*(int(temp2->n)-48)+rest;
if (num>9)
{
rest=num/10;
num=num%10;
}
else
rest=0;
Tempa.addend(num+48);
temp1=temp1->next;
}
if (rest!=0) Tempa.addend(rest+48);
for(k=i;k>=1;k--) {Tempa.addhead(0+48);}//每循环依次,临时链表都要在尾部补零,类似于手算乘法
i++;
temp1=bignum1.head;
temp2=temp2->next;
tempa=Tempa.head;
tempb=Tempb.head;
while (tempa!=NULL&&tempb!=NULL)//以下为两大整数的相加运算,与加法算法相同。
{
num2=(int(tempa->n)-48)+(int(tempb->n)-48)+rest2;
if (num2>9)
{
num2=num2-10;
rest2=1;
}
else
rest2=0;
result.addend(num2+48);
tempa=tempa->next;
tempb=tempb->next;
}
if (tempb!=NULL) tempa=tempb;
while (tempa!=NULL)
{
num2=(int(tempa->n)-48)+rest2;
if (num2>9)
{
num2=num2-10;
rest2=1;
}
else
rest2=0;
result.addend(num2+48);
tempa=tempa->next;
}
if (rest2) result.addend(rest2+48);
if (Tempa.head!=NULL) {Tempa.head=Tempa.end=NULL;}//对临时链表a置空
if (Tempb.head!=NULL) {Tempb.head=Tempb.end=NULL;}//对临时链表b置空
if (result.head!=NULL)
{
node *t=result.head;
while (t)
{Tempb.addend(t->n);t=t->next;}//将结果链表复制给临时链表b,用来下一次的相加运算
}
}
if (result.head!=NULL)
{
temp=result.head;
while (temp)
{addhead(temp->n);temp=temp->next;}
}
}

void main() //主函数
{
bigint bignum1,bignum2,bignum3;
char p='1';
while (p)
{
system("cls");
cout<<"大整数基本运算器"<<endl<<endl;;
cout<<"请选择:"<<endl;
cout<<"1.加法"<<endl;
cout<<"2.减法"<<endl;
cout<<"3.乘法"<<endl;
cout<<"按其他键退出!"<<endl<<endl;
cout<<"请输入:"<<endl;
int s;
cin>>s;
switch(s)
{
case 1:
{
cout<<"请输入第一个数字:"<<endl;
bignum1.getnum();
cout<<"请输入第二个数字:"<<endl;
bignum2.getnum();
bignum3.add(bignum1,bignum2);
cout<<"结果是:"<<endl;
bignum3.dispnum();
cout<<"按0退出,其他键继续:";
cin>>p;
p=p-48;
}break;
case 2:
{
cout<<"请输入第一个数字:"<<endl;
bignum1.getnum();
cout<<"请输入第二个数字:"<<endl;
bignum2.getnum();
bignum3.sub(bignum1,bignum2);
cout<<"结果是:"<<endl;
bignum3.dispnum();
cout<<"按0退出,其他键继续:";
cin>>p;
p=p-48;
}break;

case 3:
{
cout<<"请输入第一个数字:"<<endl;
bignum1.getnum();
cout<<"请输入第二个数字:"<<endl;
bignum2.getnum();
bignum3.mul(bignum1,bignum2);
cout<<"结果是:"<<endl;
bignum3.dispnum();
cout<<"按0退出,其他键继续:";
cin>>p;
p=p-48;
}break;
default:
p=0;
}
}
}

❻ 两个超长正整数相加(C语言)

既然楼主要求用C语言,那就用经典的C指针吧

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

char*BigIntAdd(char*x,char*y,char*z)

{

intlenx=strlen(x);

intleny=strlen(y);

char*pmax=x,*pmin=y,*pz=z,*p1,*p2,t;

inti,lenmax=lenx,lenmin=leny;

if(lenx<leny)

{

pmax=y;

pmin=x;

lenmax=leny;

lenmin=lenx;

}

p1=pmax+lenmax-1;

p2=pmin+lenmin-1;

while(p2>=pmin)

{

*pz=*p1+*p2-'0';

if(pz>z&&*(pz-1)>='0'+10)

{

*(pz-1)-=10;

*pz+=1;

}

p1--;p2--;pz++;

}

for(i=0;i<lenmax-lenmin;i++)

{

*pz=*p1;

if(pz>z&&*(pz-1)>='0'+10)

{

*(pz-1)-=10;

*pz+=1;

}

pz++;p1--;

}

pz--;

if(*pz>='0'+10)

{

*(pz++)-=10;

*pz='1';

}

for(p1=z;p1<pz;p1++,pz--)

{

t=*p1;*p1=*pz;*pz=t;

}

returnz;

}

voidmain()

{

system("color1e");

charx[1024*10]={0},y[1024]={0},z[1024]={0};

printf("EnterLargeIntegers1: ");

scanf("%s",x);

printf("EnterLargeIntegers2: ");

scanf("%s",y);

BigIntAdd(x,y,z);

printf(" BigIntAdd: %s + %s = %s ",x,y,z);

system("pause");

}

主要想法是,判断两个数字的长短,找出最短的数字,从个位数开始与另一个数的相应位进行相加(注意判断向上进位),将结果逐个保存在结果字符串中。最后将长的那个数字剩下的部分直接放在结果字符串中,然后将结果字符串反转,得到结果

❼ 超大整数的加法--C语言

这题要用高精度加法来做

参考:http://www.oschina.net/code/snippet_564999_11104

随手写了一下,没有测试大量数据,不保证完全正确

#include<stdio.h>
#include<string.h>
#defineMAXSIZE100
voidadd(char*num1,char*num2,char*ans)
{
inti,j;
//逆向赋值
//例如num1="123456"
//则a="654321000000...0"(后面用0填充)
//b同理
chara[MAXSIZE+2],b[MAXSIZE+2],c[MAXSIZE+2];
for(i=0;i<MAXSIZE+1;i++)
{
a[i]=b[i]=c[i]='0';
}
a[MAXSIZE+1]=b[MAXSIZE+1]=c[MAXSIZE+1]='';

for(i=0;i<strlen(num1);i++)
{
a[i]=num1[strlen(num1)-1-i];
}
for(i=0;i<strlen(num2);i++)
{
b[i]=num2[strlen(num2)-1-i];
}
for(i=0;i<MAXSIZE+1;i++)
{
chariAns=c[i]-'0';//ascii转为数字
chariA=a[i]-'0';
chariB=b[i]-'0';
iAns+=iA+iB;
chariJW=iAns/10;//处理进位
iAns%=10;
c[i]=iAns+'0';
c[i+1]=iJW+'0';
}
//除去前端的0
//将结果逆向赋值给ans
//返回ans
for(i=MAXSIZE;(i>=0)&&(c[i]=='0');i--);
if(i==-1)strcpy(ans,"0");
else
{
for(j=0;j<=i;j++)
{
ans[j]=c[i-j];
}
ans[j]='';
}
}
intmain(intargc,char*argv[])
{
chara[MAXSIZE+2],b[MAXSIZE+2],ans[MAXSIZE+2];
while(1)
{
scanf("%s%s",a,b);
if((strcmp(a,"0")==0)&&(strcmp(b,"0")==0))break;
add(a,b,ans);
printf("%s ",ans);
}
return0;
}

❽ C语言超长整数相加

#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 = 0; i < len1; i++)
{
arr1[i] = s1[len1-1-i] - '0';
} //求字符串长度倒序放在int 数组里面
int len2 = strlen(s2); for( i = 0; i < len2; i++)
{
arr2[i] = s2[len2-1-i] - '0';
} //加法运算
for( i = 0; i < MAXLEN; i++)
{
arr3[i] = arr1[i] + arr2[i];
} //数据处理超过9的进行取余并且进位
for( i = 0; i < MAXLEN; i++)
{ 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;
}

❾ 用C语言编程计算两个超长正整数(长度小于100)的加法

这是大数加法问题,我给你一个参考代码

输入至多100行的文本,每行是一个至多100位的十进制无符号大整数,最后的输入行为零。要求计算出这些大整数的和,并以十进制方式显示。

示例输入:
0

示例输出:#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
const int n = 100;// 数字的最大位数
const int b = 10; // 数字的进制
char r[n+1] = {0};// 加数
char s[n+1] = {0};// 求和
while (scanf("%s", r) && strcmp(r, "0")) { // 对每一个加数...
for (int i = strlen(r)-1, j = n-1; i >= 0; i--, j--) { // 中的每一个数字位
r[i] -= '0'; // char -> int
for (int k = j, c = 0; 1; k--) { // update s
const int sum = (!c ? r[i] : 0) + s[k] + c; // local sum
if ((c = sum > b - 1)) s[k] = sum - b; // do update
else { s[k] = sum; break; } // end update
}
}
}
for (int i = 0; i < n; putchar(s[i++] + '0'));
return 0;
}

❿ C语言 超长整数加法 考虑正负号

使用字符数组模拟加法运算