在酷壳看到一个编程题目——请把从1到1000的数打印出来,不能使用任何的循环语句或条件判断语句,更不能写1000个printf和cout,用C/C++语言。
最容易想到的是用递归,文中给出了一个例子:
该程序的本意是在n==1000时,n/(1000-n)的分母为0,使程序崩溃,从而结束递归。
不过用gcc编译执行时,并没有出现崩溃,而是一直输出。
只有将分母为0的除式赋值给一个变量时,程序才会崩溃,更改如下:
还有一个用宏实现的方法,不得不感叹宏的强大:
最后与一个很BT的:
这也是一个递归,利用main函数作为递归函数,
当j<1000时,j/1000为0,因为j是int型,所以执行:
(main+(exit-main)*0)(j+1);
也就是
main(j+1);
当j=1000时,j/1000为1,执行:
(main+(exit-main)*1)(1000+1);
main和exit都是函数名,即函数在内存中的地址,是可以做加减运算的,所以这时执行:
exit(1000+1);
程序退出,结束递归。
为什么j的初始值为1呢?
因为带参数的main函数的原型是:
main(int argc, char **agrv);
这里省略了第二个参数,j就是argc,程序执行是不带参数,j就是1。
所以,该程序要想真正执行,是不能带参数的。
受益匪浅!!!
分享到:
相关推荐
2.2.1 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序
输出一个不大于5位的数的位数,将它的每个数位上的数字分别输出,并逆序输出。
如n=3,k=2 输入的三个数位1 2 3 则输出 12 13 21 23 31 32 3、输入n个数(有重复),求n个数字的全排列 如:n=3 全排列的数字为1 1 2 则输出 112 121 211 4、输入n和k(n》=k) 求n个数字的(n,k)排列 如:n=3...
输出100-1000之间的所有素数,用C++写的,完全正确!
输出1到1000素数c++程序
递归实现十进制数从高位到低位依次输出 主要是我对递归算法的初步理解后试手制作希望对你有用
用js输出1-100之间7的倍数和有关7的数字
输出1000以内的水仙花数,输出1000以内的水仙花数,输出1000以内的水仙花数
求输入一个数n,输出从0到n的格雷码格雷码,是cpp的压缩文件
给定一个十进制正整数N,程序输出从1到N的所有整数中,“1”出现的个数。C语言程序附带实验报告
简单的输出十进制数输出其对应二进制数的位数,很简单 很实用
利用Java编写程序,求出1到1000的所有完全数,完全数是其所有因子(包括1但不包括本身)的和等于该数 ,例如,28=1+2+4+7+14,28就是一个完全数
C语言编程实现输出100—999之间的水仙花数
从键盘先后输入两个不大于9999的正整数m和n,若m>n,则交换两数。然后求m~n(m和n均为正整数且m≤n)之间的所有完数。 【输入形式】 先后输入两个正整数m和n,用逗号分隔 【输出形式】 输出所有完数,每两个数...
题目描述:将M进制的数X转换为N进制的数输出。 输入描述:输入的第一行包括两个整数:M和N(2,N)。下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。 输出描述: 输出X的N进制表示的...
1102:与指定数字相同的数的个数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 33228 通过数: 21033 ...输出为N个数中与m相同的数的个数。 【输入样例】 3 2 3 2 2 【输出样例】 2 【来源】 NO
内容概要:输入一个数n,输出1——n之间不能被5整除的数,一行5个数(JAVA) 适用人群:新手初学者小白 学到什么:输入输出语句、for循环控制语句、if条件控制语句、\t制表符、自增/自减的运用 、赋值语句和判断语句...
输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
输出1到n之间的素数,c语言程序,练习用。
一个Java数学排序小程序,给定三个整数x,y,z,程序处理后让这三个数由小到大排列输出,代码编写思路:想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x与y的值进行交换,然后再用x与z进行比较,如果x> z则...