C++ C++;
我有一个名为C++ C++;,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,我有一个名为LargeNum的类,它通过数组存储大量的数字,例如digit[]。因为int不够大,无法存储它 基数为10000,因此编号'9876 8764 7263'的存储方式如下: digit[4] = {9876, 8764, 7263}; (基数可以更改为10或100,如数字[12]={9,8,7,6,6,4,7,2,6,3}) 问题是我想重载运算符%,因此 可以得到两个大数的余数。重载运算符*,-在大数之间通过处理大数的每个数字来完成。但我真的不知道如何使用%实现这一点。比如: {1
LargeNum
的类,它通过数组存储大量的数字,例如digit[]
。因为int
不够大,无法存储它
基数为10000
,因此编号'9876 8764 7263'
的存储方式如下:
digit[4] = {9876, 8764, 7263};
(基数可以更改为10
或100
,如数字[12]={9,8,7,6,6,4,7,2,6,3}
)
问题是我想重载运算符%
,因此 可以得到两个大数的余数。重载运算符*
,-
在大数之间通过处理大数的每个数字来完成。但我真的不知道如何使用%
实现这一点。比如:
{1234,7890,1234} % {4567,0023}
有人能帮我吗?伪代码应该是:
while digits_source > digits_base {
while first_digit_source > first_digit_base {
source -= base << (digits_source - digits_base)
}
second_digit_source += first_digit_source * LargeNum.base
first_digit_source = 0
digits_source--
}
while (source >= base) {
source -= base
}
return source
由于65
是32
,则继续执行以下操作:
65 - 32 = 33
0 - 1 = -1
然后我们有{33,-1,99}%{32,1}
。继续
33 - 32 = 1
-1 - 1 = -2
我们有
{1,-2,99}%{32,1}
。因为32>1,所以我们将源代码的前两个数字连接起来,得到{1*1000-2,99}%{32,1}
。现在我们可以在时进入简单的,只需做减号运算。while对source>=base
进行了全面比较,因为我们不能承受负数字。但是,在算法的第一部分,我们可以这样做,因为我们保证前两位数字的组合是正的。相关此操作的结果本身可以(也应该)是LargeNum
。您最好实现所有其他算术运算符(+,-,*,/
),然后您就可以很容易地实现模运算符了。你可能会发现这很有用。使用长除法。不管你怎么做,实施分工都是不愉快的(在本例中,长除法是有限的,因为A%B都是大数字。因此数组用于按数字存储它们。感谢您的回答。例如,如果我要执行97283847283%2389238494;它们在伪代码中的确切含义是什么:数字、源、源等等。在第一个LongInt示例中,'9876 8764。)7263'
,digits_source是3,source是{987687647263}
,first_Digital_source是9876。你应该只看一个简单的例子,答案会更容易,而不是希望有不同的数据示例,让我编辑整个过程的答案。哇,这很酷!顺便说一下,如果{2,-5}%{2,7}在10的基础上,{2,-5}更小,结果是2*10-5。我已经测试了几个简单的数字,它成功了!我稍后将在程序中尝试它。你能给出如此清晰的解释,真是太好了,这种思维方式非常好!在一些特殊情况下,有一个数字,比如{12,23,-2}
或{1,-1,100,-2}
。可以通过减少数字上的一(分别为:{12,22,998}
和{0,999,99,998}
)来解决这些问题。我的算法可能会产生这些数字,也许它们应该被清除。您应该对此进行评估(可能是在返回值之前进行“清除”的过程),谢谢。:)这对我帮助很大!
33 - 32 = 1
-1 - 1 = -2