题目:求1+2+…+n,
C#不支持逗号表达式,不能用上面的第一种方法:
要求不能使用乘除法、for、while、if 、else、switch、case 等关键字以及条件判断语句(A?B:C)
下面提出三种方式方法用C++实现:
#include <iostream>
using namespace std;
//通过逻辑运算符的短路来处理
int Calc1(int n)
{
int value = 0;
return n < 0 || (value = n + Calc1(n - 1)), value;
}
//通过除0异常来处理,需要在编译命令行中启用/EHa(启用C++异常,但有SEH异常)
//gcc下不知道什么情况,未测试
int Calc2(int n)
{
try
{
return n % n + n + Calc2(n - 1);
}
catch (...)
{
return 0;
}
}
//通过n>0作为数组的索引来处理
void Calc3_Last(int sum, int value, int *result)
{
*result = sum;
}
void Calc3_Body(int sum, int value, int *result)
{
void (*func[])(int, int, int *) = {Calc3_Last, Calc3_Body};
func[value > 0](sum + value, value - 1, result);
}
int Calc3(int n)
{
int result;
Calc3_Body(0, n, &result);
return result;
}
//主函数
int main()
{
cout<<Calc1(100)<<endl;
cout<<Calc2(100)<<endl;
cout<<Calc3(100)<<endl;
return 0;
}
C#不支持逗号表达式,不能用上面的第一种方法:
using System;
namespace Slx.TestSumN_cs
{
static class Program
{
//利用除0异常来处理
public static int Calc2(int n)
{
try
{
return n % n + n + Calc2(n - 1);
}
catch (System.Exception)
{
return 0;
}
}
//通过n>0作为数组的索引来处理
public delegate void Calc3Delegate(int sum, int n, ref int result);
public static void Calc3_Last(int sum, int n, ref int result)
{
result = sum;
}
public static void Calc3_Body(int sum, int n, ref int result)
{
Calc3Delegate[] bodys = {Calc3_Last, Calc3_Body};
bodys[Convert.ToInt32(n > 0)](sum + n, n - 1, ref result);
}
public static int Calc3(int n)
{
int result = 0;
Calc3_Body(0, n, ref result);
return result;
}
//主函数
public static void Main(string[] args)
{
Console.WriteLine(Calc2(100));
Console.WriteLine(Calc3(100));
}
}
}