如何输出x=y^x, y=x而不需要另一个变量



从键盘整数中获取x,y然后执行以下操作X =y^ X y= X其中X是初值打印结果,不使用其他变量(只允许x和y)

我用LOG来做,它工作,但老师想要一个更简单的方法来做(简单的数学)。

输入例子:

X=3 Y=4

示例输出:

64 3

您可以尝试以下程序来满足您的需求。

#include <cstdio>
#include <cmath>
int main(){
    double x = 3;
    double y = 4;
    printf("y power x is = %lfn", pow(y,x));
    y=x;
    printf("%lf", y);
}

将输出:

y power x is = 64.000000
3.000000

我想

  1. x,y足够小,不会溢出整数结果
  2. x,y是非负的(如果是负的,你也需要处理)
  3. int为32位整数

我将使用for loop…

  • for很容易,但你需要有迭代和结果变量
  • 当你禁止添加变量时,你需要将它们编码到x,y
  • 的未使用空间中
  • 所以让x,y限制为16位…<0,65535>
  • 0x0000FFFF*0x0000FFFF=0xFFFE0001
  • 所以你只需要注意x<=2|y|<=1的情况所有其他情况都是OK的
  • 设下半部为x,y,上半部为i,z

在源代码中看起来是这样的(如果你想自己编码就不要读了):

// for (z=1,i=0      ;    i     <    x            ;i++          ) z*=y;
   for (y|=0x00010000;int(x>>16)<int(x&0x0000FFFF);x+=0x00010000) y=((int(y>>16)*int(y&0x0000FFFF))<<16)|int(y&0x0000FFFF);
// y=x;
   y=int(y&0xFFFF0000)|int(x&0x0000FFFF);
// x=z; free i
   x=int(y>>16);
// free z
   y&=0x0000FFFF;
(笔记)

  • 如果你还需要负值,那么你需要复制符号位…
  • 在16->32位转换期间,例如if (int(y&0x00008000)) y|=0xFFFF0000;
  • 以及在乘法期间(结果符号位乘以y符号位)…
  • 或者完全忽略它,只从y符号和x零位(奇数/偶数)计算结果符号
  • 如果结果z是整数,那么指数x不应该是负的…

相关内容

最新更新