两个无穷大的数相加
两个无穷大的数相加,因为int有限,哪怕用long int也不可能够,用string存,用手工算数的方式从右往左一位一位加,满10就进一。这样不管有多长,都能算出结果。
最近在做QT项目,所以用c++写的demo,用别的语言也是一样的,就一个for循环,从个位开始加,一直加到最高位。
举例:12345+234=?
看成:12345+00234
然后分别计算5+4,4+3,3+2,2+0,1+0,有进位就进位。
void MainWindow::on_pushButton_clicked()
{
//将页面输入的两个无穷大的数拿出来
QString edit1 = ui->lineEdit->text();
QString edit2 = ui->lineEdit_2->text();
//设置一个字符串拿来显示计算结果,将单个数相加的除去了进位的结果插入到字符串的第0位
QString showNum ="";
//用来存储单个数相加的除去了进位的结果
int oneNum =0;
//满10进位就置为1,否则就置为0,并且参与单个数相加
int enter10 =0;
//较长的字符串的长度
int bigStrLength =0;
//两个字符串的长度
int edit1Length =edit1.length();
int edit2Length =edit2.length();
//如果第一个字符串比第二个字符串长,就把第一个字符串的长度存起来,并且在短的字符串的头部补0,补到长度和第一个字符串一样长。相反,就操作第二个字符串。
if(edit1Length>edit2Length){
bigStrLength=edit1Length;
for (int f=0;f<edit1Length-edit2Length;f++) {
edit2.insert(0,"0");
}
}else{
bigStrLength=edit2Length;
for (int f=0;f<edit2Length-edit1Length;f++) {
edit1.insert(0,"0");
}
}
//循环最长的字符串的长度,从个位数开始计算并且递减,直到循环到最高位,然后结束计算,得出结果。
for (bigStrLength;bigStrLength>0;bigStrLength--) {
//把第一个字符串的最右边的一个数拿出来
QString u = edit1.mid(bigStrLength-1,1);
//把第二个字符串的最右边的一个数拿出来
QString o =edit2.mid(bigStrLength-1,1);
//两个数相加,并且加上满十进一的进位
oneNum = u.toUInt() + o.toInt(0) +enter10;
//如果结果满十,就将进位置为1,否则就置为0
if(oneNum>9){
enter10=1;
}else {
enter10=0;
}
//把单个数的计算结果插入字符串的第一位,依次插入,直到计算完两个字符串的最后一位,得出完整的计算结果
showNum.insert(0,QString::number(oneNum));
}
//把结果显示在界面
ui->textBrowser->setText(showNum);
}
如果要限制输入,可以做如下设置,不过设置了之后,就受到IntValidator的限制,长度就不能无限输入了,只能输入int所支持的最大长度。
QIntValidator *IntValidator = new QIntValidator(this) ;
//IntValidator->setRange(0, 255);//可以改成(-255,255),这样只能输入-255,255之间的数
ui->lineEdit->setValidator(IntValidator);//这样只能输入整数
ui->lineEdit_2->setValidator(IntValidator);
ui->lineEdit->setPlaceholderText("请输入整数");//背景提示用户输入范围
ui->lineEdit_2->setPlaceholderText("请输入整数");//背景提示用户输入范围