C++ 你如何计算这个函数中的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的一部分。你需要把另外两个术语再分成两部分。但是你不能计算每一个,然

考虑下面的函数,该函数将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*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
      b
      才能工作。否则,你需要更多的人工智能“单词”。e、 g.:
      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
      b
      才能工作。否则,你需要更多的人工智能“单词”。e、 g.:
      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?我漏掉了一些东西……嗯……那是因为在除法过程中失去了精度。。数学没问题,但我们