求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编辑  收藏  举报

导航