如何用C++实现针对整数的加减乘除(四则)运算函数?
时间: 2024-10-02 12:03:25 浏览: 42
在C++中,你可以创建四个模板函数来实现基本的四则运算,它们分别对应于加法、减法、乘法和除法。这里是一个简单的示例:
```cpp
template <typename T>
T add(T a, T b) {
return a + b;
}
template <typename T>
T subtract(T a, T b) {
return a - b;
}
template <typename T>
T multiply(T a, T b) {
return a * b;
}
template <typename T>
// 要注意除数为零的情况,这里仅提供基本处理,更严谨的做法需要添加异常处理
T divide(T a, T b) {
if (b != 0)
return a / b;
else
throw std::invalid_argument("Division by zero is not allowed.");
}
```
上述代码定义了四个通用的运算函数,`T`是一个模板参数,代表任意类型的整数。当你使用这些函数时,只需传入对应的整数值即可。
相关问题
用C++描述一段关于大整数的加减乘除运算
关于大整数的加减乘除运算,可以使用以下C语言代码进行描述:
```c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 1000
struct bign{ //定义结构体存储大整数
int d[maxn], len;
bign() //结构体初始化函数
{memset(d,0,sizeof(d)); len=0;}
};
bign change(char str[]) //将字符串转为大整数
{
bign res;
res.len=strlen(str);
for(int i=0;i<res.len;i++) res.d[i]=str[res.len-1-i]-'0';
return res;
}
int compare(bign a, bign b) //比较两个大整数的大小
{
if(a.len>b.len) return 1;
else if(a.len<b.len) return -1;
else
{
for(int i=a.len-1;i>=0;i--)
if(a.d[i]>b.d[i]) return 1;
else if(a.d[i]<b.d[i]) return -1;
return 0;
}
}
bign add(bign a, bign b) //大整数加法
{
bign c;
int carry=0;
for(int i=0;i<a.len || i<b.len;i++)
{
int sum=a.d[i]+b.d[i]+carry;
c.d[c.len++]=sum%10;
carry=sum/10;
}
if(carry) c.d[c.len++]=carry;
return c;
}
bign sub(bign a,bign b) //大整数减法
{
bign c;
for(int i=0,carry=0;i<a.len;i++)
{
int tmp=a.d[i]-carry-b.d[i];
if(tmp>=0) carry=0;
else
{
carry=1;
tmp+=10;
}
c.d[c.len++]=tmp;
}
while(c.len>1 && c.d[c.len-1]==0) c.len--;
return c;
}
bign mul(bign a, int b) //大整数与小整数的乘法
{
bign c;
int carry=0;
for(int i=0;i<a.len;i++)
{
int tmp=a.d[i]*b+carry;
c.d[c.len++]=tmp%10;
carry=tmp/10;
}
while(carry) //必须要判最高的一位有没有进位,否则漏了的话就少了一位
{
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
bign mul(bign a, bign b) //大整数乘法
{
bign c;
c.len=a.len+b.len;
for(int i=0;i<a.len;i++)
for(int j=0;j<b.len;j++)
c.d[i+j]+=a.d[i]*b.d[j];
for(int i=0;i<c.len;i++)
{
c.d[i+1]+=c.d[i]/10; //进位处理
c.d[i]%=10;
}
while(c.len>1 && c.d[c.len-1]==0) c.len--;
return c;
}
bign divide(bign a, int b, int &r) //大整数除以小整数
{
bign c;
c.len=a.len;
for(int i=a.len-1;i>=0;i--)
{
r=r*10+a.d[i];
if(r<b) c.d[i]=0;
else
{
c.d[i]=r/b;
r=r%b;
}
}
while(c.len>1 && c.d[c.len-1]==0) c.len--;
return c;
}
char* BignToString(bign a) //大整数转为字符串
{
char* res=new char[maxn];
for(int i=0;i<a.len;i++)
res[i]=a.d[a.len-1-i]+'0';
res[a.len]='\0';
return res;
}
int main()
{
char str1[maxn], str2[maxn];
int a,b;
scanf("%s%s%d",str1,str2,&b);
bign A=change(str1),B=change(str2),C,D,E;
C=add(A,B);
D=sub(A,B);
E=mul(A,b);
int r=0;
C=divide(A,b,r);
printf("%s\n%s\n%s\n%s\n",BignToString(C),BignToString(D),BignToString(E),BignToString(C));
return 0;
}
```
在程序中,使用结构体bign存储大整数,通过定义加法、减法、乘法、除法等运算函数,实现了大整数的加减乘除运算。同时,还可以将大整数转为字符串输出,方便进行结果的输出和格式化。
用C++编写程序,输入两个超长整数(可正可负),求和、差、乘、除四则运算并输出结果。1.用带附加头结点的单链表存储超长整数。2.实现加、减运算。3.实现乘、除运算。4.设计超长整数类,实现构造函数、析构函数、重载输入输出运算、重载加减乘除运算。
在C++中,为了处理超长整数并且利用链表存储,我们可以创建一个名为`BigInt`的类,它会包含一个指向链表节点的指针作为数据成员。下面是一个简单的实现:
```cpp
#include <iostream>
#include <string>
// 链表节点结构
struct BigIntNode {
int digit;
BigIntNode* next;
};
class BigInt {
private:
BigIntNode* head;
public:
// 构造函数
BigInt() : head(nullptr) {}
// 析构函数,释放内存
~BigInt() {
clear();
}
// 用于添加新节点
void addDigit(int value) {
if (!head) {
head = new BigIntNode{value, nullptr};
} else {
BigIntNode* current = head;
while (current->next) {
current = current->next;
}
current->next = new BigIntNode{value, nullptr};
}
}
// 清空链表
void clear() {
BigIntNode* temp = head;
while (temp) {
BigIntNode* nextTemp = temp->next;
delete temp;
temp = nextTemp;
}
head = nullptr;
}
// 重载输入运算符,从字符串读取超长整数
friend std::istream& operator>>(std::istream& in, BigInt& bigint);
// 重载输出运算符,输出链表表示的数字
friend std::ostream& operator<<(std::ostream& out, const BigInt& bigint);
// 重载加法运算,链表间的加法操作
BigInt operator+(const BigInt& other) {
BigInt sum(*this);
return sum.add(other);
}
// 加法私有实现
BigInt add(const BigInt& other) {
// ... 实现链表的加法算法
}
// 类似的,可以实现减法、乘法和除法运算
// 乘法示例
BigInt operator*(const BigInt& other) {
// ... 实现链表间的乘法算法
}
// 除法示例
BigInt operator/(const BigInt& divisor) {
// ... 实现链表间的除法算法
}
};
// 这里省略了输入输出运算符的重载部分,它们通常涉及遍历链表并逐位相加(对于输入)、或者逐位计算结果(对于输出)
阅读全文