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