m3ph1st0s的编程难题3(C):“简易错误”


11

这是我的C / C ++难题系列的第3个。万一您错过了前2个,则它们在这里:(1)m3ph1st0s的编程难题1(C ++) (2)m3ph1st0s的编程难题2(C ++):“辛苦!”

我必须说我的难题是100%原始的。如果没有,我将始终在案文中声明。我的第三个谜题分为以下两个部分:

拼图3.1

这一部分(3.1)并不是我的原始难题,它是从我前一段时间读过的一些互联网页面中收集的。我在这里以它为起点并为您热身。解决该问题,然后继续进行第二部分。

有人尝试打印“ +”号20次,并提出了以下程序:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

它没有达到预期结果的事实是显而易见的-该程序永无止境。修理它!简单?现在,通过更改“仅一个字符”来修复程序-当然不是空格字符!对于这一挑战,有3种解决方案。找到所有的三个。为了清楚起见:该程序必须输出20个“ +”号,并且必须快速结束。在就“快速”的含义批评我之前,我要说这最多意味着几秒钟(顺便说一下,这太多了,只是为了使它变得清晰起来)。

拼图3.2

编辑 前面曾指出,针对3.2.2难题的解决方案可能取决于编译器。为了消除对该主题的任何可能的讨论,当我会格外小心以免引起争议时,我将修改想法并在下一个难题中对其进行改进。但是,为了使这个难题继续下去,我将对3.2.2进行一些小的修改(该解决方案会更简单但更干净)。

当我第一次看到拼图时,我发现它很棒。我确实设法解决了这个问题,但没有立即解决,因为它需要仔细注意。如果您在这里,则意味着您也已解决它。如果您通过编写一个程序用所有可能的值替换所有可能的字符并测试每个解决方案来这样做,那么您将会迷失方向。努力工作的家伙。现在已更正了写20个“ +”号的程序:

3.2.1:在代码中插入一个字母,仅输入一个字母,以使结果有效,并在所有3个更正的程序中输出相同的内容。不用说,字母必须在main的}之前(我之所以这么说是因为我不想听到有人只是在程序后加上字母,并且他们的编译器非常友好)。

编辑(请参见下面)-对于这些最后的问题,请考虑将计数器i从-1而不是0开始。

3.2.1.5:重复所有先前的问题,条件是输出至少为19个“ +”号(但仍为有限输出)。允许更改空间。现在,您可能会发现比第一种情况更多的解决方案。其中某些将绝对适合3.2.2问题。

3.2.2:选择另一个值以初始化变量n,以便对于3.2.1.5中的至少一个更正程序,结果输出将保持相同(不一定对所有程序都相同)。

上次编辑1:更改程序,使其输出21个“ +”符号仍然是一个很好的解决方案,因为原始文本没有说“准确” 20个符号。但是,无限输出是禁止的。显然,这并不意味着我们所有人都开始输出数百个“ +”符号,因为这是禁止的。但是消除美好的21项输出并不是本次比赛的精神。

LAST EDIT2:考虑LAST EDIT1并接受空间更改,看来我们现在有5个可能的解决方案,其中四个已经在响应中指出。但是,最后一个挑战还没有触及,我必须再次澄清:必须为n分配另一个值,通过一些技巧将20分配给n的解决方案不会这样做(例如n = 20L)。我也更喜欢看到不改变空格的第三个解决方案。

最后编辑3:我已经编辑了最后一个问题,请阅读!

挑战在于解决难题的两个部分。第一个这样做的人获胜。

我希望一切都清楚了,如果没有,请发表任何问题,我会尽快进行编辑。干杯。 强调文字


我假设更改一个字符包括将任何空格更改为非空格字符?如果是这样,我想我已经找到了部分1.所有3个解决方案
mellamokb

哦..对不起..我当时想明确否认这一点,但我忘记了。我现在编辑。谢谢问。
Bogdan Alexandru

很好 因为我找不到对于当前的3个解决方案而言,第3.2.2部分的任何答案……我想那意味着我需要再寻找一个方法:)
mellamokb

是的:)祝您好运
Bogdan Alexandru

1
@ardnew:我不认为OP曾经改变了问题的初衷。我同意,比在结尾处添加一堆Edit更好的方法来解决该问题……但是它仍然是同一个问题的核心,并澄清了一些问题。
mellamokb

Answers:


8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

这些更改中的任何一个都会使程序输出20个“ +”号。这是接近的:

for( i = 0;~i < n; i-- )

它输出21个“ +”号。

3.2.1

我发现至少有112种方法可以解决插入一个字母的问题。并非所有人都可以在所有编译器上正常工作。

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

对于最后两个,用任何字母替换为x您提供104个可能的解决方案。使用最后两行中的任何一行将更改输出,但是对于所有3个更正的程序,输出仍将相同。

3.2.2

我只想出一些事情,这些问题在分配给时会回溯到20 int

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

是的,您有与我完全相同的答案(我之前没有发布过这些答案,因为我没有所有答案)。我认为,对3.2.2的答案在于对3.1的第​​三个解决方案,我们两个人都没有找到(并遵守不允许更改空间的规则)。
mellamokb

在3.2.1,我不知道该fd后缀int类型(当然,d对于任何类型为此事),但也有你离开的几个人:int n = 20lint n = 20U,和int n = 20u。我也不相信uintC或C ++中的标准类型标识符。无论如何,您正在使用什么编译器?
ardnew 2012年

您在这里做得不错,但是还不完整!首先,〜i解决方案仍然不错!要求是输出20个“ +”号,所以21仍然是一个好的解决方案(唯一的不好的解决方案是无限输出)。这意味着您现在找到了4个解决方案!有趣的是,我还有一个:)关于3.2.2,这很糟糕,因为我特别要求更改n的值,而不是做一些技巧使其变为20 :)
Bogdan Alexandru

1
而且,-i和〜i解决方案都更改了空间,因此我将它们视为“部分”解决方案。第三个完整解决方案必须更改测验文本中指定的非空格字符
Bogdan Alexandru

1
你不明白这个问题。我说过修改将产生与核心修改后的程序相同的输出。也就是说,我有更正的程序C1,C2,C3。插入字符后,我有P1,P2,P3。要求是:P1与C1具有相同的输出,P2与C2具有相同的输出,P3与C3具有相同的输出。不是P1,P2,P3具有相同的输出
Bogdan Alexandru

2

3.1

另一个难题。但是正常的解决方案很无聊,那么特别的事情呢?

解决方法一:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

我决定只更改一个字符,即-。除-更改外,没有其他字符。

解决方案二:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

这正好改变了一个字符- int i变成后的分号=printf("++++++++++++++++++++");exit(0);

解决方法三:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

这将加载stdix.h系统头文件。在系统包含路径中,插入以下文件,名为stdix.h。它必须包含以下内容。

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

现在插入一个字母。好吧,很简单,替换int main()int main(a)。根据标准,这是无效的,但是谁在乎呢?



0

3.1

  1. 更改i--n--
  2. i<n-i<n
  3. (不幸的是,答案无效,因为在看到其他答案之前我没有与编译器进行检查)

3.2.1

int n = 20 

uint n = 20

(取决于编译器...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

与相同,可打印19个以上的符号int n = 20L;。但是,如果我没有看到关于3.2.1的其他答案,我不会想出来。


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
确保将程序语言和字符数添加到答案中。
Timtech

1
@Timtech为什么要计算字符数?这不是代码高尔夫球
骄傲的haskeller 2014年

1
@Timtech还为什么要包含该语言?这是特定于语言的挑战。
骄傲的haskeller 2014年
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.