编程之谜:无需减法计数

Pet*_*ter 18 puzzle

好的,逐个目标:执行此操作的命令行应用程序:

Countdown.exe 7

打印7 6 5 4 3 2 1

没有任何形式的减法(包括使用减号)或字符串反转所允许的.

waaaaay显然太容易了:-)概述答案(至少原则)

  1. 通过添加和递归
  2. 通过使用modulo
  3. 通过推动和弹出,(也许是最明显的?)
  4. 通过使用溢出
  5. 通过使用反复试验(可能最不明显?)

小智 46

x = param;
while (x > 0) {
    print x;
    x = (x + param) mod (param + 1);
}
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 38

添加和递归怎么样?

public void Print(int i, int max) {
  if ( i < max ) { 
    Print(i+1, max);
  }
  Console.Write(i);
  Console.Write(" ");
}

public void Main(string[] args) {
  int max = Int32.Parse(args[0]);
  Print(1, max);
}
Run Code Online (Sandbox Code Playgroud)


ken*_*418 17

这是你错过的方法,试验和错误:

import java.util.Random;

public class CountDown
{
    public static void main(String[] args)
    {
        Random rand = new Random();

        int currentNum = Integer.parseInt(args[0]);

        while (currentNum != 0)
        {
            System.out.print(currentNum + " ");
            int nextNum = 0;
            while (nextNum + 1 != currentNum) {
               nextNum = rand.nextInt(currentNum);
            }

          currentNum = nextNum;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


JP *_*oto 15

将1-7推入堆栈.弹出堆栈一个接一个.打印7-1.:)

  • 不是它被认为是数组反转? (2认同)

Sco*_*ham 13

使用2的赞美,毕竟这是计算机处理负数的方式.

int Negate(int i)
{
   i = ~i;  // invert bits
   return i + 1; // and add 1
}

void Print(int max)
{
   for( int i = max; i != 0; i += Negate(1) )
   {
     printf("%d ", i);
   }
}
Run Code Online (Sandbox Code Playgroud)

http://en.wikipedia.org/wiki/2's_complement


Pau*_*lin 11

将数字前置到字符串缓冲区中.

String out = "";
for (int i = 0; i < parm; i++)
{
   out = " " + (i+1) + out;
}
System.out.println(out);
Run Code Online (Sandbox Code Playgroud)


Sco*_*ham 11

c/c ++,有点算术溢出:

void Print(int max)
{
   for( int i = max; i > 0; i += 0xFFFFFFFF )
   {
      printf("%d ", i);
   }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*her 10

我注意到没有人发布最愚蠢的答案,所以我会继续分享它:

int main (int argc, char **argv) {
  if ( ( argc < 1 ) || ( atoi(argv[1]) != 7 ) ) {
    printf("Not supported.\n");
  } else {
    printf("7 6 5 4 3 2 1\n");
  }
}
Run Code Online (Sandbox Code Playgroud)

不要恨我:看?我承认这是愚蠢的.:)


Sco*_*ham 8

使用舍入误差:

void Decrement(int& i)
{
    double d = i * i;
    d = d / (((double)i)+0.000001); // d ends up being just smaller than i
    i = (int)d; // conversion back to an int rounds down.
}

void Print(int max)
{
   for( int i = max; i > 0; Decrement(i) )
   {
     printf("%d ", i);
   }
}
Run Code Online (Sandbox Code Playgroud)


Dyl*_*ett 7

这并不难.使用模数运算符.

for (int n = 7; n <= 49; n += 7) {
  print n mod 8;
}
Run Code Online (Sandbox Code Playgroud)


Boo*_*jum 7

按位算术

恒定空间,没有加法,减法,乘法,除法,模数或算术否定:

#include <iostream>
#include <stdlib.h>
int main( int argc, char **argv ) {
    for ( unsigned int value = atoi( argv[ 1 ] ); value; ) {
        std::cout << value << " ";
        for ( unsigned int place = 1; place; place <<= 1 )
            if ( value & place ) {
                value &= ~place;
                break;
            } else
                value |= place;
    }
    std::cout << std::endl;
}   
Run Code Online (Sandbox Code Playgroud)