求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
1. C/C++特有的解法:
int add_fun(int n, int & sum) { n && add_fun(n-1, sum); return (sum += n); }
此解法巧妙利用了&&运算符的特性和数字0代表逻辑判断中的“假”,Java是不能利用此方法的。
2. 也是C/C++特有的,利用编译器来帮我们完成类似于递归的运算:
template <int n> struct solution4_Sum { enum Value { N = solution4_Sum<n - 1>::N + n}; }; template <> struct solution4_Sum<1> { enum Value { N = 1}; };
虽然没看懂。。。
引用一段:solution4_Sum<100>::N就是1+2+...+100的结果。当编译器看到solution4_Sum<100>时,就是为模板类
solution4_Sum以参数100生成该类型的代码。但以100为参数的类型需要得到以99为参数的类型,因为solution4_Sum<100>::N=solution4_Sum<99>::N+100。这个过程会递归一直到参数为1的类型,由于该类型已经显式定义,编译器无需生成,递归编译到此结束。由于这个过程是在编译过程中完成的,因此要求输入n必须是在编译期间就能确定,不能动态输入。这是该方法最大的缺点。而且编译器对递归编译代码的递归深度是有限制的,也就是要求n不能太大。
3. 高能预警,FBI WARING!
你妹的,老子qj了你,哈哈哈
//66666666666666666666666666666 n=100,10×10 666666666666666666666666666666
int b(int n){ return n + n+1 + n+2 + n+3 + n+4 + n+5 + n+6 + n+7 + n+8 + n+9; } int c(){ return b(1) + b(11) + b(21) + b(31) + b(41) + b(51) + b(61) + b(71) + b(81) + b(91); }
posted on 2016-09-23 22:40 WindInWillows 阅读(304) 评论(0) 编辑 收藏 举报