1.getnum函数
2.加法重载
3.减法重载
4.乘法重载
小明希望实现MyInteger类,并可以实现部分操作。
2条回答 默认 最新
- qfl_sdu 2022-12-11 21:04关注
#include <iostream> #include <string> #include <stdlib.h> using namespace std; #define MAXNUM (int)300 class MyInteger{ private: string num; public: MyInteger(){num="0";} MyInteger(string s){num = s;} ~MyInteger(){} string getnum(){return num;} void setnum(string s){num =s;} MyInteger operator+(const MyInteger& bint2) //大整数加法 { char* a = new char[MAXNUM]; char* b = new char[MAXNUM]; char* c = new char[MAXNUM]; strcpy(a,num.c_str()); strcpy(b,bint2.num.c_str()); bigAdd(a,b,c); MyInteger res(c); free(a);a=0; free(b);b=0; free(c);c=0; return res; } MyInteger operator-(const MyInteger& bint2) //大整数减法 { char* a = new char[MAXNUM]; char* b = new char[MAXNUM]; char* c = new char[MAXNUM]; string flag =""; strcpy(a,num.c_str()); strcpy(b,bint2.num.c_str()); if(num.length() > bint2.num.length()) bigSub(a,b,c); else if(num.length() < bint2.num.length()) { flag ="-"; bigSub(b,a,c); }else { if(strcmp(num.c_str(),bint2.num.c_str())> 0) bigSub(a,b,c); else if(strcmp(num.c_str(),bint2.num.c_str())<0) { flag ="-"; bigSub(b,a,c); }else { free(a);a=0; free(b);b=0; free(c);c=0; return MyInteger("0"); } } string str = c; MyInteger res(flag + str); free(a);a=0; free(b);b=0; free(c);c=0; return res; } MyInteger operator*(const MyInteger& bint2) //大整数乘法 { char* a = new char[MAXNUM]; char* b = new char[MAXNUM]; char* c = new char[MAXNUM]; strcpy(a,num.c_str()); strcpy(b,bint2.num.c_str()); bigMul(a,b,c); MyInteger res(c); free(a);a=0; free(b);b=0; free(c);c=0; return res; } private: //去除前面的0 void movePreZero(char c[]) { int i; while (c[0] == '0') { for (i = 0; i < strlen(c) - 1; i++) c[i] = c[i + 1]; c[strlen(c) - 1] = 0; } } //大数相加 void bigAdd(char a[], char b[], char c[]) { int i = 0; int shift = 0, val; int l1 = strlen(a); int l2 = strlen(b); int len = l1 > l2 ? l1 : l2; len += 1; //多留一个进位 c[len] = 0; //后一个位置为0 //从后往前迭代 l1--; l2--; len--; while (l1 >= 0 && l2 >= 0) { int t = (a[l1] - '0') + (b[l2] - '0') + shift; if (t >= 10) { shift = 1; t -= 10; c[len] = '0' + t; } else { shift = 0; c[len] = '0' + t; } len--; l1--; l2--; } //a while (l1 >= 0) { int t = (a[l1] - '0') + shift; if (t >= 10) { shift = 1; t -= 10; c[len] = '0' + t; } else { shift = 0; c[len] = '0' + t; } len--; l1--; } //b while (l2 >= 0) { int t = (b[l2] - '0') + shift; if (t >= 10) { shift = 1; t -= 10; c[len] = '0' + t; } else { shift = 0; c[len] = '0' + t; } len--; l2--; } if (shift != 0) c[0] = '0' + shift; else c[0] = '0'; movePreZero(c); } //大数相乘 void bigMul(char a[], char b[], char c[]) { int i, j, t, k, val; int maxlen; int shift = 0; int l1 = strlen(a); int l2 = strlen(b); char tmp[MAXNUM] = { 0 }; //结果最多是l1+l2位数 maxlen = l1 + l2; c[maxlen] = 0; //字符串正常结束 for (i = 0; i < maxlen; i++) c[i] = '0'; if (l1 < l2) { //交换a和b strcpy(tmp, a); strcpy(a, b); strcpy(b, tmp); t = l1; l1 = l2; l2 = t; } for (t = 0, i = l2 - 1; i >= 0; i--, t++) //遍历b,乘以a的所有数 { shift = 0; memset(tmp, '0', maxlen); tmp[maxlen] = 0; for (k = 0, j = l1 - 1; j >= 0; j--, k++) { val = (b[i] - '0') * (a[j] - '0') + shift; if (val >= 10) { shift = val / 10; val = val % 10; } else shift = 0; tmp[maxlen - 1 - t - k] = '0' + val; } if (shift) tmp[maxlen - 1 - t - k] = '0' + shift; //print(tmp); shift = 0; //计算c与tmp的和 for (k = maxlen - 1; k >= 0; k--) { if (tmp[k] == 0) continue; else { val = c[k] - '0' + tmp[k] - '0' + shift; if (val >= 10) { shift = val / 10; val = val % 10; } else shift = 0; c[k] = '0' + val; } } } movePreZero(c); } //大数相减,成功返回1,a<b返回0 int bigSub(char a[], char b[], char c[]) { int i = 0; int shift = 0, val; int l1 = strlen(a); int l2 = strlen(b); if (l1 < l2) { c[0] = 0; return 0; } //b后移l1-l2位,并且前面补0 for (i = l2 - 1; i >= 0; i--) b[i + l1 - l2] = b[i]; for (i = 0; i < l1 - l2; i++) b[i] = '0'; b[l1] = 0; //逐位相减 i = l1 - 1; c[l1] = 0; while (i >= 0) { val = a[i] - b[i] - shift; if (val < 0) { val += 10; shift = 1; } else shift = 0; c[i] = '0' + val; i--; } if (shift) { c[0] = 0; return 0; } //去除前面的0 movePreZero(c); //去除b前面的0 movePreZero(b); //printf("%s",c); if (strlen(c) == 0) { c[0] = '0'; //留1个0 c[1] = 0; } return 1; } }; int main() { MyInteger a("123456789"); MyInteger b("9876543210"); MyInteger c = a+b; MyInteger d = a-b; MyInteger e = a*b; cout << "a="<<a.getnum()<<endl; cout << "b="<<b.getnum()<<endl; cout << "c=a+b="<<c.getnum()<<endl; cout << "d=a-b="<<d.getnum()<<endl; cout << "e=a*b="<<e.getnum()<<endl; return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 表达式必须是可修改的左值
- ¥15 如何绘制动力学系统的相图
- ¥15 对接wps接口实现获取元数据
- ¥20 给自己本科IT专业毕业的妹m找个实习工作
- ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
- ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
- ¥50 mac mini外接显示器 画质字体模糊
- ¥15 TLS1.2协议通信解密
- ¥40 图书信息管理系统程序编写
- ¥20 Qcustomplot缩小曲线形状问题