m3ph1st0s的编程难题1(C ++)[关闭]


26

这是为您准备的一系列C ++难题中的第一个。希望你会喜欢。

因此,难题1:

给定以下程序:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

在程序内任何位置的新行上插入一些代码,以便输出为0。新行将包含AT MOST 18个字符(包括空格),其余行将保持不变。要清楚,这是有效的新代码的示例:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   int* p = NULL;
   const float c=0.5;
   std::cout << a/b-a*c;
}

插入了一行15个字符的新行,这样就可以了。但是,它不能解决问题。

如果这对您来说太简单了,请不要担心,还会有更多!


2
我很高兴有人偶尔发布C ++问题!我的意思是,对于所有的难题,C ++解决方案都是20或30行,然后人们用J或K或Golfscript发布解决方案会过一阵子。
李斯特先生,2012年

3
结果必须是有效的,定义明确的C ++还是可以使用UB?(但正如Lister先生指出的那样,原始代码甚至不是有效的C ++。)
Konrad Rudolph 2012年

4
这是无效的。主要必须返回INT(读C ++标准)
BЈовић

2
我们在这里错过了重点。如果您介意的话,请输入int并返回0,但我没有。
Bogdan Alexandru

11
@Bogdan:Dafuq?首先,DevC ++是如此古老,它的输出是无关紧要的。其次,以任何给定操作系统为目标的任何给定配置中的任何给定编译器是否在任何时候都接受它并不会使它成为有效的C ++。
DeadMG 2012年

Answers:


14
#define int float

应该也一样,并且长度相同。


这是我脑子里想的,当我第一次的想法来到
波格丹亚历

5
#define int float实际上是未定义的行为。不允许您赋予关键字新的含义。
fredoverflow 2012年

弗雷德,您能引用您的消息来源吗?GCC cpp文档说:“您可以将任何有效的标识符定义为宏,即使它是C关键字也是如此。”
2012年

@丹:C ++标准禁止这样做。
DeadMG

3
它可能是UB,但是仍然有一些流行的编译器支持它。我已经#define int ERROR强迫自己使用等效的int32_t而不是内置类型。到我接触的时候int main(),我已经忘记了宏,并且想知道为什么我的代码无法编译。
dan04 2014年

33

我们可以通过将a = 1移到另一个范围来摆脱它:

#include <iostream>
main() 
{
int a=0;if(0)
    const int a=1;
    const int b=2;
    const float c=0.5;
    std::cout << a/b-a*c;
}

我认为这是13个字符。或者更好的是获得一个新的a结果也为0:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
if(int a=2)
   std::cout << a/b-a*c;
}

那是11个字符


24
#include <iostream>
main() 
{
   const int a=1;
#define a 0
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

1个新行,12个新字符


这就是我想提交的... +1。
H2CO3

阅读问题时我的第一个想法)))
Qwertiy 2015年

23

因此#define a 0,完成。我看到了发布-毫不奇怪。

令人惊讶的是,这没有发布:

#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout<<0||
   std::cout << a/b-a*c;
}

14个字符

那应该做,对吧?


21
#include <iostream>
main() 
{
const int a=0;//\
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

17个字符。

顺便说一句,原始程序无法在MSVC下编译,MSVC抱怨main没有返回类型。


2
int a = 0; // \也可以解决问题
复制

2
绝对。但这是“最短线获胜”的竞赛吗?
李斯特先生,2012年

我是这么认为的,但事实并非如此。顺便提一下
复制

2
是的,最短的解决方案在codegolf SE上获胜。看常见问题解答
BЈовић

2
常见问题解答@BЈовиsays说,对于实际的代码高尔夫球问题,最短的解决方案胜出。这个问题显然不是一个代码高尔夫问题。
kojiro 2012年

11

18,包括换行符

#define float int

我不太确定这是否可行...您将c声明为float并用0.5初始化它
Bogdan Alexandru

5
它将截断为零。
DeadMG 2012年

没错,有趣的事情是我从未遇到过用十进制值初始化int的事情,我认为这将是编译器错误,但它只会发出警告
Bogdan Alexandru

2
@BogdanAlexandru对C ++标准有所了解,在此专门详细介绍了隐式转换。
oldrinb 2012年

2
请注意,尽管所有编译器都允许这样做,但是该标准禁止重新定义关键字(并且float是关键字)。
avakar 2012年


9
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a 0;1
   std::cout << a/b-a*c;
}

14个字符。


7
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   return puts("0");
   std::cout << a/b-a*c;
}

17个字符。


1
迄今为止最好的解决方案,因为它可以解决任何与C ++相关的问题。
fabspro 2012年

3
未在此范围内声明“ puts”
shiona 2012年

@shiona您正在使用什么编译器?
阿什(Ashrr)

@Ashrr gcc(g ++)4.5.4
shiona 2012年

1
不要认为,此代码返回0。但是您可以通过感叹号替换空间。无论如何,我不确定puts何时返回零。
Qwertiy 2015年

7
#include <iostream>
main()
{
   const int a=1;
   const int b=2;
   const float c=0.5;
std::cout<<0;//\
   std::cout << a/b-a*c;
}

它是17个字符,所以正好适合。


7

我不知道C ++,但是基于这个问题,您不能只输入一行以简单地输出0吗?该问题指定输出应为0,但未指定您必须将输出更改为0。

std::cout << 0

(我对C ++有0条线索,但也许有人可以使用此概念)


哦,好,输出应该只是0,我认为这很明显,否则就不会产生困惑了,是吗?
Bogdan Alexandru

7
@BogdanAlexandru您会发现,利用写得不好的问题是解决这些难题的常用技术。如果要阻止用户使用这些快捷方式,请花一些额外的时间来分析您自己的问题,并尝试消除任何潜在的歧义。
ardnew 2012年

3

12个字符,类似于暴民的解决方案

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a b
   std::cout << a/b-a*c;
}

其他组合也可以使用,例如#define a c#define c 0



0

C ++什么...

echo "0"; exit
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

通过:

sh mp.cpp

不错的尝试,但违反了要求:有效的C ++。
康拉德·鲁道夫2012年


-1
#include <iostream>
int main() 
{
int a;if(a)
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

那这11个字符怎么样?


1
这里的问题是int abefore if尚未初始化,因此a可能有任何值。
Frozenkoi 2012年

1
这是未定义的,您正在使用的未初始化值a
康拉德·鲁道夫

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.