C++ 你如何计算这个函数中的j?
考虑下面的函数,该函数将a*b的结果转换为一对数字i和j,其中:C++ 你如何计算这个函数中的j?,c++,algorithm,math,C++,Algorithm,Math,考虑下面的函数,该函数将a*b的结果转换为一对数字i和j,其中: a、 b,x,y是int(假设它们总是=>32位长) a和b是您正确启动,但丢失了o计算周围的绘图。首先,我的假设是:你不想处理任何大于n*m的整数,所以取mod n*m就是作弊。我这么说是因为给定m>2^16,我必须假设int是32位长的,它能够处理数字而不会溢出 无论如何。您已经正确地(我猜,因为没有指定n和m的目的)写了: 这里,a0*b0n*m,所以它是i的一部分。你需要把另外两个术语再分成两部分。但是你不能计算每一个,然
o
计算周围的绘图。首先,我的假设是:你不想处理任何大于n*m
的整数,所以取mod n*m
就是作弊。我这么说是因为给定m>2^16
,我必须假设int是32位长的,它能够处理数字而不会溢出
无论如何。您已经正确地(我猜,因为没有指定n
和m
的目的)写了:
这里,a0*b0
,所以它是j
的一部分,a1*b1*n*m>n*m
,所以它是i
的一部分。你需要把另外两个术语再分成两部分。但是你不能计算每一个,然后取mod n*m
,因为那样会作弊(根据我上面的规则)。如果你写:
a0*b1 = a0b1_0 + a0b1_1*n
你会得到:
a0*b1*m = a0b1_0*m + a0b1_1*n*m
由于a0b1_0
,a0b1_0*m
,这意味着该部分转到j
。显然,a0b1\u 1
转到i.
对a1*b0重复一个类似的逻辑,对于j
,您有三个项要加起来,对于i
,还有三个项要加起来
编辑:忘了提几件事:
- 您需要约束
和a
才能工作。否则,你需要更多的人工智能“单词”。e、 g.:b
a=a0+a1*n+a2*n^2,ai
的最终总和可能大于j
。您需要注意溢出(n*m
,或类似的逻辑,并在发生这种情况时将n*m-o<加数
添加到1
,同时计算i
,而无溢出)j+加数-n*m
o
时丢失了绘图。首先,我的假设是:你不想处理任何大于n*m
的整数,所以取mod n*m
就是作弊。我这么说是因为给定m>2^16
,我必须假设int是32位长的,它能够处理数字而不会溢出
无论如何。您已经正确地(我猜,因为没有指定n
和m
的目的)写了:
这里,a0*b0
,所以它是j
的一部分,a1*b1*n*m>n*m
,所以它是i
的一部分。你需要把另外两个术语再分成两部分。但是你不能计算每一个,然后取mod n*m
,因为那样会作弊(根据我上面的规则)。如果你写:
a0*b1 = a0b1_0 + a0b1_1*n
你会得到:
a0*b1*m = a0b1_0*m + a0b1_1*n*m
由于a0b1_0
,a0b1_0*m
,这意味着该部分转到j
。显然,a0b1\u 1
转到i.
对a1*b0重复一个类似的逻辑,对于j
,您有三个项要加起来,对于i
,还有三个项要加起来
编辑:忘了提几件事:
- 您需要约束
和a
才能工作。否则,你需要更多的人工智能“单词”。e、 g.:b
a=a0+a1*n+a2*n^2,ai
的最终总和可能大于j
。您需要注意溢出(n*m
,或类似的逻辑,并在发生这种情况时将n*m-o<加数
添加到1
,同时计算i
,而无溢出)j+加数-n*m
- 我想答案是j=a0*b0
(a*b)/(n*m) = (a/n) * (b/m)
= (a1 + a0/n) * (b1 + b0/m)
= a1*b1 + a1*b0/m + a0*b1/n + (a0*b0)/(n*m)
现在
将两侧乘以n*m
a * b = o * n*m + a0*b0
n*m是基数
a * b = o * BASE + a0*b0
j = a0*b0
QED我想答案是j=a0*b0
(a*b)/(n*m) = (a/n) * (b/m)
= (a1 + a0/n) * (b1 + b0/m)
= a1*b1 + a1*b0/m + a0*b1/n + (a0*b0)/(n*m)
现在
将两侧乘以n*m
a * b = o * n*m + a0*b0
n*m是基数
a * b = o * BASE + a0*b0
j = a0*b0
这是家庭作业吗?如果可以的话也没关系——让我们知道就好了。:)@塔林,看起来更像是一个采访问题,为什么BASE被分为
n
和m
?在这个问题中,我看不到任何基于任何一个变量的约束。@Suraj-我总是问。。。以防万一。但你是对的,这看起来更像是一个面试问题。如果你愿意,你可以使用BASE=10^8,但是你必须以一种可移植的方式用整数计算i。n、 m实际上是用来分开a和B的吗?如果可以的话也没关系——让我们知道就好了。:)@塔林,看起来更像是一个采访问题,为什么BASE被分为n
和m
?在这个问题中,我看不到任何基于任何一个变量的约束。@Suraj-我总是问。。。以防万一。但你是对的,这看起来更像是一个面试问题。如果你愿意,你可以使用BASE=10^8,但是你必须以一种可移植的方式用整数计算i。n、 m实际上用于拆分a和bHello CantGetANick,试着编译我给出的程序,该程序应该遵循您所说的相同的数学运算。尝试在代码中设置x.j=a0*b0,然后运行它。/program 1234578 8754321。为什么a0*b0 31397538而不是92111538?我漏掉了一些东西……嗯……那是因为在除法过程中失去了精度。。数学是可以的,但我们在计算a0,b0时使用整数。这个答案是错误的,因为o
不一定是整数。(例如,用n=1,m=7,a=3,b=3试试你的算法。)问题是,a1*b0不一定能被m整除,a0*b1也不一定能被n整除。是的,正如迪马斯特所说,问题是a1*b0/m和a0*b1/nHello CantGetANick,试着编译我给出的程序,它应该遵循你告诉的相同的数学运算。尝试在代码中设置x.j=a0*b0,然后运行它。/program 1234578 8754321。为什么a0*b0 31397538而不是92111538?我漏掉了一些东西……嗯……那是因为在除法过程中失去了精度。。数学没问题,但我们