大数相加(c/c++)

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,1000CU*H 3个月
简介: 本程序使用C++模板实现顺序表类,通过线性表进行大整数的加法运算。将大整数按位存储于数组中,逆序相加并处理进位,最后正序输出结果。算法时间复杂度为O(n),适用于位数超过20的大整数计算,支持动态输入两组大数并输出和的结果。


一、问题与要求
问题:1、大整数运算C++中整型的表示范围受限,但在某些领域存在大整数(如位数>20)的计算。请使用线性表实现大整数的加法和乘法,并分析算法时间复杂度。

要求:顺序表类用C++的模板实现

算法用流程图和伪代码的形式分别描述,并分析算法时间复杂度

二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)

自然语言:首先在头文件中定义顺序表类,在public中声明函数,private中创建固定数组和数据长度,在具体的加法函数实现中记录进位变量,用短的数据长度次进行循环相加进位,并用array数组接收,每经过一次循环,两个数据长度减一,较长的数据长度继续进行进位操作,若最后还有一位进位,存入array数组,由于存入数组的顺序是从右向左,为逆序,因此需要正序存入data数组中。
时间复杂度:O(N)

伪代码:
3.流程图:

三、源程序及注释
三个文件:

大数相加.h

大数相加函数.cpp

大数相加测试.cpp

四、运行输出结果:

五、源代码:
大数相加.h:

include

using namespace std;

class Seqlist
{
public:
Seqlist(){length = 0;}
Seqlist(int a[], int n);
~Seqlist(){}
void SeqlistAdd(Seqlist A,Seqlist B,int array[]);
void Print_sum();
int count();

private:
    int num[100];
    int length;

};
extern int sub;
extern int E[1000];

Seqlist::Seqlist(int a[],int n)//将数组的值传入顺序表中
{
for(int i=0;i<n;i++)
{
num[i]=a[i];
}
length=n;
}

void Seqlist::SeqlistAdd(Seqlist A,Seqlist B,int array[])
{
int a=A.length,b=B.length;
int sh=a<b?a:b;//选择短的数据长度
int m=a-1,n=b-1;//两个数组下标
sub=0;//和数组下标
int jw=0;//产生的进位
for(int i=0;i<sh;i++)
{
int add=A.num[m--]+B.num[n--]+jw;
array[sub++]=add%10;
jw=add/10;
}

while(m>=0)
{
    int add=A.num[m--]+jw;
    array[sub++]=add%10;
    jw=add/10; 
}
while(n>=0)
{
    int add=B.num[n--]+jw;
    array[sub++]=add%10;
    jw=add/10; 
}

if(jw)
{
    array[sub++]=jw;
}
length=sub;
for(int i=0;i<length;i++)
{
    num[i]=array[length-i-1];
}

}

void Seqlist::Print_sum()
{
for(int i = 0; i < length; i++){
cout << num[i];
}
}

int Seqlist::count()
{
return length;
}
大数相加函数.cpp:

include"大数相加.h"

int sub;
int E[1000];

Seqlist::Seqlist(int a[],int n)//将数组的值传入顺序表中
{
for(int i=0;i<n;i++)
{
num[i]=a[i];
}
length=n;
}

void Seqlist::SeqlistAdd(Seqlist A,Seqlist B,int array[])
{
int a=A.length,b=B.length;
int sh=a<b?a:b;//选择短的数据长度
int m=a-1,n=b-1;//两个数组下标
sub=0;//和数组下标
int jw=0;//产生的进位
for(int i=0;i<sh;i++)
{
int add=A.num[m--]+B.num[n--]+jw;
array[sub++]=add%10;
jw=add/10;
}

while(m>=0)
{
    int add=A.num[m--]+jw;
    array[sub++]=add%10;
    jw=add/10; 
}
while(n>=0)
{
    int add=B.num[n--]+jw;
    array[sub++]=add%10;
    jw=add/10; 
}

if(jw)
{
    array[sub++]=jw;
}
length=sub;
for(int i=0;i<length;i++)
{
    num[i]=array[length-i-1];
}

}

void Seqlist::Print_sum()
{
for(int i = 0; i < length; i++){
cout << num[i];
}
}
大数相加主程序.cpp:

include"大数相加.h"

int sub;
int E[1000]; //逆序数组变量

int main()
{

int m;
cout<<"请输入位数:";
cin>>m;
int arr1[m];
cout<<endl<<"请输入数字:"; 
for(int i=0;i<m;i++)
{
    cin>>arr1[i];
}

cout<<endl;

int n;
cout<<"请输入位数:"; 
cin>>n;
int arr2[n];
cout<<endl<<"请输入数字:"; 
for(int i=0;i<n;i++)
{
    cin>>arr2[i];
}



Seqlist A(arr1,m);
Seqlist B(arr2,n);

Seqlist sum;
sum.SeqlistAdd(A, B, E);
cout<<"位数为:"<<sum.count()<<endl; 
cout << "大数相加:" << endl;
A.Print_sum(); 
cout << " + " << endl; 
B.Print_sum(); 
cout << " = " << endl; 
sum.Print_sum(); 
cout << endl << endl;

return 0;

}

相关文章
|
存储 C++
蓝桥杯练习题六 - 大数乘法(c++)
蓝桥杯练习题六 - 大数乘法(c++)
287 0
蓝桥杯练习题六 - 大数乘法(c++)
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
109 0
|
4月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
184 0
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
216 12
|
7月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
140 16
|
8月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
7月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
7月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
7月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
399 6