从键盘整数中获取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
我想
-
x,y
足够小,不会溢出整数结果 -
x,y
是非负的(如果是负的,你也需要处理) -
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
不应该是负的…