【问题标题】:how to print x=y^x , y=x without another variable如何在没有另一个变量的情况下打印 x=y^x , y=x
【发布时间】:2015-12-01 13:23:51
【问题描述】:

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

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

示例输入:

X=3 Y=4

示例输出:

64 3

【问题讨论】:

  • 你的意思是printf( "%d %d\n", pow( (int) x, (int) y ), x );
  • 标点符号和正确的大小写如何帮助人们更清楚地理解这个问题?
  • @Jacajack:我希望不会。该问题被标记为 C++,而不是 C。
  • 您的老师在制定清晰的问题陈述方面的技能似乎有点……缺乏。
  • 在 C 和类 C 语言中 ^ is the xor operator, not power

标签: c++ math


【解决方案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);
}

Which will output:

y power x is = 64.000000
3.000000

【讨论】:

  • 1) 缩进代码。 2) 在 C++ 中,它是 #include &lt;cmath&gt;,而不是 math.h。 3)return不是函数,不要像函数一样使用
  • 它给了我一个错误,我想它必须存储在 x 中,不仅像我说的那样打印它,我使用 log 并且它有效,但老师希望它更简单
  • @AymanIBreak 这是因为 Maruthi Srinivas 使用 printfint 而不是 const char *。尝试将其更改为printf( "%d", y );
  • 抱歉出现错误。正如 AymanIBreak 所说,它应该是 printf("%d", y)。
  • 我这样做了,但没有成功 ||=== Build: Debug in ayman (compiler: GNU GCC Compiler) ===| C:\Users\ayman\Desktop\ayman\main.cpp||在函数'int main()':| C:\Users\ayman\Desktop\ayman\main.cpp|9|警告:格式“%d”需要“int”类型的参数,但参数 2 的类型为“double”[-Wformat]| obj\Debug\main.o||在函数main':| C:\Users\ayman\Desktop\ayman\main.cpp|3|multiple definition of main'| obj\Debug\main.o:C:\Users\ayman\Desktop\ayman\main.cpp|3|首先在这里定义| ||=== 构建失败:2 个错误,1 个警告(0 分钟,0 秒)===|
【解决方案2】:

我认为

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

我会使用 for 循环...

  • for 很简单,但你需要有迭代和结果变量
  • 由于您禁止添加变量,您需要将它们编码到x,y 的未使用空间中
  • 所以让x,y 限制为 16 位 ...&lt;0,65535&gt;
  • 0x0000FFFF*0x0000FFFF=0xFFFE0001
  • 所以您只需要注意x&lt;=2|y|&lt;=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&amp;0x00008000)) y|=0xFFFF0000;
  • 以及在乘法期间(将结果符号位与y 符号位异或)...
  • 或完全忽略它并仅从y 符号和x 零位(奇/偶)计算结果符号
  • 因为结果z 是整数,所以指数x 不应该是负数...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多