#include <iostream>
static int current = 1;
struct print
{
print() { std::cout << current++ << std::endl; }
};
int main()
{
print numbers [1000];
}
166
#include <stdio.h>
#define Out(i) printf("%d\n", i++);
#define REP(N) N N N N N N N N N N
#define Out1000(i) REP(REP(REP(Out(i))));
void main()
{
int i = 1;
Out1000(i);
}
int print1000(int num=1)
{
printf("%d\n", num);
// it will check first the num is less than 1000.
// If yes then call recursive function to print
return num<1000 && print1000(++num);
}
int main()
{
print1000();
return 0;
}
15
我错过了所有的乐趣,所有好的C答案都已经发布了!
这是我能想到的最奇怪的事情,我不会打赌这是合法的C99:p
#include <stdio.h>
int i = 1;
int main(int argc, char *argv[printf("%d\n", i++)])
{
return (i <= 1000) && main(argc, argv);
}
另一个,有点作弊:
#include <stdio.h>
#include <boost/preprocessor.hpp>
#define ECHO_COUNT(z, n, unused) n+1
#define FORMAT_STRING(z, n, unused) "%d\n"
int main()
{
printf(BOOST_PP_REPEAT(1000, FORMAT_STRING, ~), BOOST_PP_ENUM(LOOP_CNT, ECHO_COUNT, ~));
}
最后的想法,同样的欺骗:
#include <boost/preprocessor.hpp>
#include <iostream>
int main()
{
#define ECHO_COUNT(z, n, unused) BOOST_PP_STRINGIZE(BOOST_PP_INC(n))"\n"
std::cout << BOOST_PP_REPEAT(1000, ECHO_COUNT, ~) << std::endl;
}
15
非常简单:
int main(int argc, char* argv[])
{
printf(argv[0]);
}
30 回答
我不是写了1000次printf语句!
别客气 ;)
它没有打印所有的数字,但它确实是"Print numbers from 1 to 1000."获胜的暧昧问题! :)
编译时间递归! :P
这个实际上编译为没有任何条件的程序集:
编辑:添加了'&'因此它会考虑地址,从而避免指针错误 .
这个版本的上面标准C,因为它不依赖于对函数指针的算术运算:
我很惊讶似乎没有人发布这个 - 我认为这是最明显的方式 .
1000 = 5*5*5*8.
看起来它不需要使用循环
以下是我所知道的三种解决方案 . 第二个可能是有争议的 .
[编辑:(1)和(4)只能用于编译时常量,(2)和(3)也可用于运行时表达式 - 结束编辑 . ]
触发致命错误!这是文件countup.c:
编译,然后在shell提示符下执行:
这确实打印了从1到1000的数字,没有任何循环或条件!
使用系统命令:
未经测试,但应该是香草标准C:
与其他人相比有点无聊,但可能是他们正在寻找的东西 .
该任务从未指定程序必须在1000之后终止 .
(如果运行./a.out且没有额外的参数,可以缩短到此值)
非常简单! :P
我们可以启动1000个线程,每个线程打印一个数字 . 安装OpenMPI,使用
mpicxx -o 1000 1000.cpp
编译并使用mpirun -np 1000 ./1000
运行 . 您可能需要使用limit
或ulimit
来增加描述符限制 . 请注意,这将是相当慢的,除非你有大量的核心!当然,数字不一定按顺序打印,但问题不需要订购 .
用普通C:
当然,您可以为其他基础实现相同的想法(2:print2 print4 print8 ...),但这里的数字1000建议基数10.您还可以减少添加中间函数的行数:
print2() print10() print20() print100() print200() print1000()
和其他等效替代品 .只需将std :: copy()与特殊迭代器一起使用即可 .
函数指针(ab)使用 . 没有预处理器魔法来增加输出 . ANSI C
难看的C答案(每10次幂只展开一个堆栈帧):
堆栈溢出:
这是一个8MB的堆栈 . 每个函数调用似乎需要大约32个字节(因此32 * 1000) . 但是当我运行它时,我只得到804(因此196 * 32;也许C运行时在堆栈中还有其他部分你必须扣除) .
功能指针的乐趣(不需要新的TMP):
作为旁注:我也禁止条件限制扩展到逻辑和关系运算符 . 如果允许逻辑否定,则递归调用可以简化为:
我觉得这个答案非常简单易懂 .
我错过了所有的乐趣,所有好的C答案都已经发布了!
这是我能想到的最奇怪的事情,我不会打赌这是合法的C99:p
另一个,有点作弊:
最后的想法,同样的欺骗:
非常简单:
执行方法:
规范并没有说必须生成序列 inside 代码:)
更多预处理程序滥用:
我觉得很脏我想我现在会去淋浴 .
如果接受POSIX解决方案:
由于对bug没有限制..
甚至更好(?),