/*********************************************************************
题目:求1+2+3+....+n,要求不能使用乘除法,for、while、if、else、switch、
case等关键字及条件判断语句(A?B:C)。
*********************************************************************/
/*
*/
#include<stdio.h>
// ====================方法一====================
//利用构造函数
class Temp
{
public:
Temp() { ++ N; Sum += N; }
static void Reset() { N = 0; Sum = 0; }
static unsigned int GetSum() { return Sum; }
private:
static unsigned int N;
static unsigned int Sum;
};
unsigned int Temp::N = 0;
unsigned int Temp::Sum = 0;
unsigned int Sum_Solution1(unsigned int n)
{
Temp::Reset();
Temp *a = new Temp[n];
delete []a;
a = NULL;
return Temp::GetSum();
}
// ====================方法二====================
//利用虚函数
class A;
A* Array[2];
class A
{
public:
virtual unsigned int Sum (unsigned int n)
{
return 0;
}
};
class B: public A
{
public:
virtual unsigned int Sum (unsigned int n)
{
return Array[!!n]->Sum(n-1) + n;
}
};
int Sum_Solution2(int n)
{
A a;
B b;
Array[0] = &a;
Array[1] = &b;
int value = Array[1]->Sum(n);
return value;
}
// ====================方法三====================
//利用函数指针求解
typedef unsigned int (*fun)(unsigned int);
unsigned int Solution3_Teminator(unsigned int n)
{
return 0;
}
unsigned int Sum_Solution3(unsigned int n)
{
static fun f[2] = {Solution3_Teminator, Sum_Solution3};
return n + f[!!n](n - 1);
}
// ====================测试代码====================
void Test(int n, int expected)
{
printf("Test for %d begins:\n", n);
if(Sum_Solution1(n) == expected)
printf("Solution1 passed.\n");
else
printf("Solution1 failed.\n");
if(Sum_Solution2(n) == expected)
printf("Solution2 passed.\n");
else
printf("Solution2 failed.\n");
}
void Test1()
{
const unsigned int number = 1;
int expected = 1;
Test(number, expected);
}
void Test2()
{
const unsigned int number = 5;
int expected = 15;
Test(number, expected);
}
void Test3()
{
const unsigned int number = 10;
int expected = 55;
Test(number, expected);
}
void Test4()
{
const unsigned int number = 0;
int expected = 0;
Test(number, expected);
}
int main()
{
Test1();
Test2();
Test3();
Test4();
return 0;
}
==参考剑指offer
分享到:
相关推荐
用递归求1+2+3+...+n的算法。初学者使用。
编程求1+1/2+1/3+...+1/n 输入 输入:输入一行,只有一个整数n(1<=n) 输出 输出:输出只有一行(这意味着末尾有一个回车符号),包括1个实数。(保留3位小数) 样例输入 Copy 5 样例输出 Copy 2.283
1158:求1+2+3+... 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 14633 通过数: 12299 ...用递归的方法求1+2+3+……+N的值。 【输入】 输入N。 【输出】 输出和。 【输入样例】 5 【输出样例】 15 【来源】 No
求1+1*2+1*2*3+...+1*2*3*...*n的和
求满足1+2+3+…n的最大正整数n的MATLAB程序
【C语言】1+2+3+...+n的值源码 适用于初学者学习
求1+2+..+n的和,数值范围最大支持long long
Description 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2...第2至n+1每行一个正整数。 Output 对应每组输入,输出正整数n的不同划分个数。 Sample Input 2 5 6 Sample Output 7 11
java代码-使用Java递归求和1+2+3+...+n的源代码 ——学习参考资料:仅用于个人学习使用!
C语言编程-编写函数fun求1!+2!+3!+ …… +n!的和,在main函数中由键盘输入n值,并输出运算结果;请编写fun函数;例如:若n值为5,则结果为153;
用labview8.5 求1+2+3+……(n-1)的和
编写函数求下式的值,n^1+n^2+n^3+……+n^10,其中,n=1,2,3。函数参数的默认值为1.。
求1+2+…+n.md
建一个控制台应用程序,要求输入数字n后,输出1!+2!+…+n!的结果
c语言程序设计教程(第二版)谭浩强,经典例题,对于学习c语言有很大帮助
求n个整数的阶乘1!+2!+3!+...n!,VB.net源代码
算法的特性:输入输出、有穷性、确定性、可行性。 时间复杂度:T(n)=O(f(n))。 空间复杂度:S(n)=O(f(n))。...常用的时间复杂度所耗费的时间从小到大依次是:O(1)(logn)(n)(n logn)(n²)(n³)(2的n次方)(n!)(n的n次方)
编程实现计算:1!+2!+3!+……+N!的值,要求定义并调用函数计算N!。
2.编写函数,求出"1/(1X2)-1/(2X3)+1/(3X4)-1/(4X5)+…"前n项的和,函数以n为参数,它是用户输入的 def sum(n): r=0 while n>=1: if n%2==0: r-=1/(n*(n+1)) else: r+=1/(n*(n+1)) n-=1 return r num=int...