如何在没有其他变量的情况下打印 x=y^x , y=x

问题描述 投票:0回答:2

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

我用LOG来做这件事并且它有效,但老师想要一种更简单的方法来做到这一点(简单的数学)。

输入示例:

X=3 Y=4

输出示例:

64 3
math
2个回答
-1
投票

您可以根据您的要求尝试以下程序。

#include <cstdio>
#include <cmath>

int main(){
    double x = 3;
    double y = 4;

    printf("y power x is = %lf\n", pow(y,x));
    y=x;
    printf("%lf", y);
}

将会输出:

y power x is = 64.000000
3.000000

-1
投票

我认为

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

我会使用for循环...

  • for
    很简单,但你需要有迭代和结果变量
  • 因为您禁止添加变量,所以您需要将它们编码到
    x,y
  • 的未使用空间中
  • 所以将
    x,y
    限制为 16 位...
    <0,65535>
  • 0x0000FFFF*0x0000FFFF=0xFFFE0001
  • 所以你只需要关心
    x<=2
    |y|<=1
    的情况,所有其他情况都可以
  • 让下部为
    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
    不应该是负数...
© www.soinside.com 2019 - 2024. All rights reserved.