大整数相加的问题

xiaoshi935 2009-05-12 11:45:41
代码如下:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

class BigInt { //定义大整数类
string s;
public:
BigInt(string s1) { s = s1; }
~BigInt () {}
friend BigInt operator+ (BigInt a, BigInt b); //重载操作符+
friend ostream& operator<<( ostream& o, const BigInt &a ); //重载输出操作符
};

BigInt operator+ (BigInt a, BigInt b) {
int MaxLen, MinLen,temp,i,j;
int carry = 0;
a.s.size() < b.s.size() ? MaxLen = b.s.size(),MinLen = a.s.size() : MaxLen = a.s.size(),MinLen = b.s.size();
for (i = MaxLen-1, j = MinLen - 1; i >= 0, j >= 0; i--,j--) {
temp = a.s[i] - '0' + b.s[j] -'0' + carry;
a.s[i] = temp % 10 + '0';
carry = temp/10;
}
while (carry > 0) {
temp = a.s[i] -'0' + carry;
a.s[i] = temp%10 +'0';
carry = temp/10;
i--;
}
return a;
}

ostream& operator<<( ostream& o, const BigInt &a ) {
return o << a.s << endl;
}

int main () {
BigInt a("445555555555555555555555545555");
BigInt b("1");
cout << a+b;
BigInt a1("1");
BigInt b1("445555555555555555555555545555");
cout << a1+b1; //反过来写为什么不行
}

问题:同样的相加,为什么正着加可以反着加就是不行呢,是不是MaxLen,MinLen哪里出错了,还是怎样?请大家给建议呀~
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lpf000 2009-05-13
  • 打赏
  • 举报
回复
把长的 交换为a,
b长,就 a.s.swap(b.s);
lori227 2009-05-13
  • 打赏
  • 举报
回复

int main () {
BigInt a("5455555555555555555555555555555");
BigInt b("66666666666666666666666666666666666666");
cout << a+b;
}


这两个相加 b的长度是没有变的 可是 两个BigInt b("66666666666666666666666666666666666666") 相加的话, 长度已经增加1了~·你用[]来访问字符串 这个时候已经越界的!
xiaoshi935 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lori227 的回复:]
C/C++ code
a.s.size() <= b.s.size() ? (MaxLen = b.s.size(),MinLen = a.s.size(), c = b.s, d = a.s) : (MaxLen = a.s.size(),MinLen = b.s.size(), c = a.s, d = b.s);




其实问题不是在这里~~~ 你没有处理 进位的问题~~~ 4 + 4= 8 正常 而 5 + 5 = 10 这个时候 字符串数组已经越界了~~~这个情况你要处理~~
[/Quote]


int main () {
BigInt a("5455555555555555555555555555555");
BigInt b("66666666666666666666666666666666666666");
cout << a+b;
}


有处理进位哦,上面这段代码都可以运行的,而且都是正确的结果。
那个while (carry > 0) 那句话是处理最后一位的情况的。
lori227 2009-05-13
  • 打赏
  • 举报
回复

a.s.size() <= b.s.size() ? (MaxLen = b.s.size(),MinLen = a.s.size(), c = b.s, d = a.s) : (MaxLen = a.s.size(),MinLen = b.s.size(), c = a.s, d = b.s);


其实问题不是在这里~~~ 你没有处理 进位的问题~~~ 4 + 4= 8 正常 而 5 + 5 = 10 这个时候 字符串数组已经越界了~~~这个情况你要处理~~
xiaoshi935 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lori227 的回复:]
C/C++ code

for (i = MaxLen-1, j = MinLen - 1; i >= 0, j >= 0; i--,j--) {
temp = a.s[i] - '0' + b.s[j] -'0' + carry; //第2个情况这里的 a.s[i] 和 b.s[j] 也要换过来的
a.s[i] = temp % 10 + '0';
carry = temp/10;
}

while (carry > 0) {
temp = a.s[i] -'0' + carry;
a.s[i] = temp%10 +'0';
carry = temp/10;
i--;
}






[/Quote]

可是还有一个问题哦,如果按照下面的格式输入的话:

int main () {
BigInt a("500000000000000000000000000000000000");
BigInt b("500000000000000000000000000000000000");
cout << a+b;
}

如果两个个数相等的话就没有结果,如果不相等的话就会有结果而且是正确的。
lori227 2009-05-13
  • 打赏
  • 举报
回复


for (i = MaxLen-1, j = MinLen - 1; i >= 0, j >= 0; i--,j--) {
temp = a.s[i] - '0' + b.s[j] -'0' + carry; //第2个情况这里的 a.s[i] 和 b.s[j] 也要换过来的
a.s[i] = temp % 10 + '0';
carry = temp/10;
}

while (carry > 0) {
temp = a.s[i] -'0' + carry;
a.s[i] = temp%10 +'0';
carry = temp/10;
i--;
}







a.s.size() < b.s.size() ? (MaxLen = b.s.size(),MinLen = a.s.size(), c = b.s, d = a.s) : (MaxLen = a.s.size(),MinLen = b.s.size(), c = a.s, d = b.s);

for (i = MaxLen-1, j = MinLen - 1; i >= 0&&j >= 0; i--,j--) {
temp = c[i] - '0' + d[j] - '0' + carry;
c[i] = temp % 10 + '0';
carry = temp/10;
}
while (carry > 0) {
temp = c[i] -'0' + carry;
c[i] = temp%10 +'0';
carry = temp/10;
i--;
}
a.s = c;
return a;

mengde007 2009-05-13
  • 打赏
  • 举报
回复
你这个算法有问题;有个返回的字符串的内容是空;没法输出;
ZPZ07117007 2009-05-13
  • 打赏
  • 举报
回复
楼上的代码怎么运行的时候怎么那么多的错误啊
xianyuxiaoqiang 2009-05-13
  • 打赏
  • 举报
回复
while (carry > 0) {
temp = a.s[i] -'0' + carry;
a.s[i] = temp%10 +'0';
carry = temp/10;
i--;
}
问题就是这个循环了。默认了a比较长。
yet_flash 2009-05-13
  • 打赏
  • 举报
回复
能编译通过吗?
xiaoshi935 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lori227 的回复:]
C/C++ code
int main () {
BigInt a("5455555555555555555555555555555");
BigInt b("66666666666666666666666666666666666666");
cout << a+b;
}




这两个相加 b的长度是没有变的 可是 两个BigInt b("66666666666666666666666666666666666666") 相加的话, 长度已经增加1了~·你用[]来访问字符串 这个时候已经越界的!
[/Quote]
哦,懂了你的意思了,哈哈,我想想办法
代码转载自:https://pan.quark.cn/s/50df8825dc0d Tensilica Xtensa指令集架构手册是一份详尽阐述Xtensa指令集架构(ISA)的参考指南,它主要面向Tensilica公司所推出的处理器核心,尤其是LX106核,同时亦涵盖了ESP8266和ESP32等相关内容。该手册全面介绍了Xtensa处理器核心的指令集、配置选项、扩展能力以及将架构映射至硬件的详细情况。接下来将依据手册中所述的知识点进行深入解读。 ### Xtensa指令集架构(ISA) Xtensa指令集架构是Tensilica公司为其处理器产品设计的一套指令集,该指令集具备高度的可配置性和可扩展性。这一特性使得Xtensa ISA能够在不同的应用领域和硬件需求中进行个性化定制,以满足特定的功能与性能要求。 #### 可配置性(Configurability) Xtensa ISA的可配置性体现在用户可以根据实际需求对处理器的多个方面进行定制。这包括但不限于: - **指令集扩展**:用户可以根据特定的应用需求添加新的指令,从而提升处理特定任务的效率。 - **寄存器文件扩展**:根据应用需求,可以增加或优化处理器的寄存器数量和类型。 - **协处理器扩展**:通过集成特定的协处理器,可以将专门的计算任务卸载到协处理器上,从而提升整体性能。 #### 可扩展性(Extensibility) Xtensa ISA不仅可配置,还拥有卓越的可扩展性,它支持多种扩展,包括: - **状态扩展(State Extensions)**:允许处理器添加新的状态寄存器,以支持新的功能或增强现有功能。 - **指令扩展(Instruction Extensions)**:...
下载代码方式:https://pan.quark.cn/s/8779ceeac982 YOLOv5被认为是一种功能卓越且精确度高的目标检测系统,它在即时处理场景中展现出优越的性能。"基于YOLOv5的火灾检测"计划致力于运用这项尖端的计算机视觉方法,以达成对火焰和烟雾的有效辨识,进而起到防止及降低火灾事故的作用。在这个压缩文件里,用户能够获取到预先训练完成的模型,这表示使用者能够直接执行推理检测,无需从头开始训练模型。 我们现在将详细探讨YOLO(You Only Look Once)系统。YOLO是一种单阶段的目标检测方法,它将目标检测任务转化成回归问题,通过直接预测边界框和类别可能性来迅速识别图像中的物体。YOLOv5是这一系列的最新迭代,由Ultralytics团队研发,它在前几代的基础上进行了改进,包括更迅速的训练速率、更精准的检测以及更强的适应性。 YOLOv5的关键优化包含: 1. **数据增强**:应用了Mosaic数据增强技术,这是一种融合了随机缩放、翻转、裁剪及色彩调节的技巧,增强了模型的普遍适用性。 2. **更高效的架构**:运用了SPP-Block(Spatial Pyramid Pooling)和Path Aggregation Network (PANet)设计,提升了特征提取的效能和精确度。 3. **权重初始化**:采用了更优化的权重初始化策略,使模型在初始训练阶段就能更快地达到收敛。 4. **联合训练**:YOLOv5支持多尺度训练,即同步训练不同尺度的网络,以改善对小目标的检测效果。 5. **优化的损失函数**:使用了GIOU(Generalized IoU)损失函数,改进了边界框的定位。 针对火灾检测的应用,YOLOv...

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧