- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
因此,对于我的作业,我必须创建一个计算器,该计算器可以处理最长 256 个字符的大整数。我目前要做的任务是让它与更大的数字相乘。 DIGITS 是每个 Bigint 类的数字限制,目前为了调试设置为 20,但将增加到 256
当进行类似 25 * 137 的计算时,我得到的答案是 3285,而它应该是 3425。当我查看为调试而设置的 cout 时,i 循环的第一次迭代完美运行并将 685 添加到总和为 5 * 137,因此效果很好。然而,当它到达必须执行 i 循环的第二次迭代的位置时,它是 20 * 137,它得到的答案是错误的,我无法弄清楚为什么。我有一种暗示,这与进位是两位数 (14) 有关,但我仍然无法真正弄清楚如何解决它。
明显有问题的主要实现是在 bigint 类的 * 运算符中。我知道这与 << 或 >> 运算符无关,因为它们非常适合加法和减法。
bigint 类的完整代码如下:
#include <iostream>
#include <string>
#include "Bigint.h"
#include <cmath>
using namespace std;
Bigint::Bigint()
{
for (int i = DIGITS-1; i >= 0; --i) {
digits_[i] = 0;
}
}
ostream& operator<< (ostream& out, const Bigint& n)
{
string s = "";
bool found = false;
for (int i = DIGITS - 1; i >= 0; --i) {
if(n.digits_[i] > 0) {
found = true;
}
if(n.digits_[i] != 0 || found == true) {
s += char(n.digits_[i] + '0');
}
}
if (s == "") {
s = "0";
}
return out << s;
}
istream& operator>> (istream& in, Bigint& n)
{
// Extracts full-length number (does not work for any other length).
// All characters are assumed to be valid digits.
//
string s;
if (in >> s) {
for (int i = 0; i < DIGITS; ++i) {
n.digits_[i] = i < s.length() ? s[s.length() - 1 - i] - '0' : 0;
}
}
return in;
}
Bigint operator+ (const Bigint& n1, const Bigint& n2)
{
Bigint ret;
int cur_carry = 0;
for(int i = 0; i < DIGITS; ++i) {
int n1_digit = n1.get(i);
int n2_digit = n2.get(i);
if(n1_digit < 0 || n1_digit > 9) {
n1_digit = 0;
}
if(n2_digit < 0 || n2_digit > 9) {
n2_digit = 0;
}
//printf("n1 : %d\n", n1_digit);
//printf("n2 : %d\n", n2_digit);
int sum = n1_digit + n2_digit + cur_carry;
//cout << "sum : " << sum << endl;
cur_carry = Bigint::getCarry(sum);
//cout << "new carry : " << cur_carry << endl;
ret.set(i, Bigint::getDigitValue(sum));
//cout << "Set : " << i << "," << Bigint::getDigitValue(sum) << endl;
}
return ret;
}
Bigint operator* (const Bigint& n1, const Bigint& n2)
{
Bigint ret;
//int borrowed = 0;
Bigint sum;
for(int i = 0; i < DIGITS ; i++){
int n1_digit = n1.get(i);
//cout << "n2: " << n2_digit << endl;
Bigint temp;
if(n1_digit < 0 || n1_digit > 9) {
n1_digit = 0;
}
int carry = 0;
for (int j = 0; j < DIGITS ; j++){
int val = n1_digit * (pow(10, i)) * n2.get(j);
cout << "n1: " << n1_digit << endl;
cout << "n2: " << n2.get(j) << endl;
if(carry != 0){
temp.set(j, (Bigint::getDigitValue(val)) + carry);
cout << "Carry was " << carry << ", now set 0" << endl;
cout << "value to set: " << (Bigint::getDigitValue(val)) + carry << endl;
carry = 0;
}
else if(carry == 0){
temp.set(j, Bigint::getDigitValue(val));
cout << "value to set: " << (Bigint::getDigitValue(val))<< endl;
}
carry = (Bigint::getCarry(val) + carry);
cout << "carry: " << carry << endl;
}
cout << "Sum before adding temp: " << sum << endl;
sum = sum + temp;
cout << "Sum after adding temp: " << sum << endl;
}
ret = sum;
return ret; // Only correct when n2 equals 1.
}
int Bigint::get(int pos) const {
//Return address of digit for reading
int ret = digits_[pos];
return ret;
}
void Bigint::set(int pos, int val) {
this->digits_[pos] = val;
}
int Bigint::getCarry(int val) {
//Integer division, always floors
return val/10;
}
int Bigint::getDigitValue(int val) {
return val % 10;
}
头文件:
#ifndef BIGINT_H_
#define BIGINT_H_
#define DIGITS 20
class Bigint
{
public:
/**
* Creates a Bigint initialised to 0.
*/
Bigint();
/**
* Inserts n into stream or extracts n from stream.
*/
friend std::ostream& operator<< (std::ostream &out, const Bigint& n);
friend std::istream& operator>> (std::istream &in, Bigint& n);
/**
* Returns the sum, difference, product, or quotient of n1 and n2.
*/
friend Bigint operator* (const Bigint& n1, const Bigint& n2);
friend Bigint operator+ (const Bigint& n1, const Bigint& n2);
int get(int pos) const;
void set(int pos, int val);
static int getCarry(int val);
static int getDigitValue(int val);
private:
int digits_[DIGITS];
};
#endif // BIGINT_H_
主要内容:
#include <iostream>
#include "Bigint.h"
using namespace std;
int main(int argc, char *argv[])
{
Bigint n1, n2;
char op;
while (cin >> n1 >> op >> n2) {
switch (op) {
case '+' :
cout << n1 + n2 << endl;
break;
case '*' :
cout << n1 * n2 << endl;
break;
}
}
return 0;
}
}
最佳答案
你不应该使用这条线 int val = n1_digit * (pow(10, i)) * n2.get(j);
因为它会给出整数溢出,因为你正在使用 bigintger而是使用乘数中的数字并在结果后面添加零。
要添加的零的数量将取决于乘数位的位置,您可以从这个循环中找到变量 i for(int i = 0; i < DIGITS ; i++)
在重载的 * 函数中
关于c++ - BigInt 计算器吐出稍微错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58056791/
我正在使用 gmp 执行复杂的操作。我想使用 Botan 来执行加密功能。问题是他们都有自己的 Bigint 函数。因此,在将 gmp 函数中使用的 bigint 值提供给 Botan 函数时会产生问
我正在尝试运行查询: let query = ` DELETE FROM ${table_name} WHERE
我有以下代码片段: use num_bigint::*; // 0.2.2 use num_traits::*; // 0.2.8 use std::ops::*; fn xgcd(b: &BigIn
我有一个 Postgres 8.2 表,其中列定义为 bigint 数据类型。 当我执行 sum(column) 时,返回类型是 numeric。我想强制将总和类型转换为 bigint,因为我确信结果
我有这样一个场景: CREATE TABLE `Users` ( `IdUser` bigint(20) NOT NULL PRIMARY KEY ) ENGINE=InnoDB DEFAULT
我想遍历一系列具有 BigUint 类型的值(来自 num crate )。 我该怎么做? 我试过了 for i in 0..a {...} 其中 a 是(借用的)BigUint 类型。我收到有关不匹
环境: Ubuntu 14.04 MySql 工作台 6.2.4 MariaDB 10 当我尝试将模型与数据库模式同步时,我已经在一个表中定义了 UNSIGNED BIGINT 类型(即 UNSIGN
我正在使用一个列来存储 UNIX 时间戳以秒为单位(除以 1000)。我发现 bigint 数据类型足以存储它。我使用 创建了它 ... createTimeStamp bigint, ...
我假设一种语言的实现允许您将指针视为整数,包括对它们进行标准算术。如果由于硬件限制这是不现实的,请告诉我。如果编程语言通常没有这么强大的指针运算,但是在实践中是可行的,那么我仍然想知道这种实现BigI
我正在尝试使用 Spark 将数据从 greenplum 移动到 HDFS。我可以从源表中成功读取数据,数据框(greenplum 表)的 spark 推断模式是: 数据框架构: je_header
我有一个表名称file_upload它的 upload_id 列为 BIGINT(11) AI PK NOT NULL当我将表列大小更改为 BIGINT(20) 时,AI 标志被删除,每次更改列中的任
我必须将一些加密代码从我不太熟悉的 java (visual c++) 移植到 visual c++。我在 http://sourceforge.net/projects/cpp-bigint/ 找到
我正在尝试对任意大整数实现 Solovoy-Strassen 素性检验。我还将编写一个 bignum(不能使用第 3 方实现,因为这是一个学术项目)。我已经决定了 bignum 的以下结构: stru
我有两个模型(商店和产品),两者的主键都是 BigInt,但产品(store_id)中的关系列仍然是整数。我不想使用原始 SQL,如何使用 Django 解决此问题? 例子: class Produc
有没有办法得到 BigInt 的对数?在 JavaScript 中? 对于普通数字,您将使用以下代码: const largeNumber = 1000; const result = Math.lo
在我的嵌入式项目中,我有一个处理任意长度整数的 biginteger 类。我希望能够生成一个介于 0 和任意数字之间的随机 bigint。假设我有一个高质量的随机字节源。 我见过的所有实现基本上都做同
我有一个 pandas pyspark 中的数据框.我想将此数据框创建/加载到 hive table 。 pd_df = pandas data frame id
有没有办法获得可以存储在 bigint 中的最大值,而无需对其进行硬编码? 是否有返回/包含此值的函数或常量? 最佳答案 请参阅 this similar question 中提供的答案.据我所知,没
我正在使用 Chapel,我正在尝试对 bigint 执行计算多语言环境设置中的数组。读取每行包含一个整数的文件。每行转换为 bigint记录然后插入到单个数组中。我有 4 个语言环境,因此我要求每个
我有一个存储过程,它必须返回一个 bigint 作为输出。下面如果定义。 在正文中,我在表中插入一行并在 @LogID 输出变量中使用 @@Identity 返回标识。 除返回部分外,一切正常。我试过
我是一名优秀的程序员,十分优秀!