求1+2……+n,不能用循环和乘除和条件判断语句
2014-03-14 20:48
260 查看
一 利用构造函数求解
每个实例化都会调用构造函数,同时静态变量使得变量只有一个副本,每次实例化后值的改变影响一直存在。
class Temp
{
public:
Temp(){++n;sum+=n;} //++n从1开始
static void Rest(){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 sum1(unsigned int n)
{
Temp::Rest(); //再次调用时初始化
Temp *p=new Temp
(); //()表示初始化为0
delete[] p; //delete[]只是释放指针所指向的内存空间,指针还是指向空间地址
p=NULL;
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) //virtual可以不使用,因为系统会根据3方面的检查自动确定为虚函数
{
return Array[!!n]->Sum(n-1) + n; //当n不为0时,为Array[1]指向子类的函数,,n为0时,为Array[0],指向基类的函数
}
};
int Sum2(int n)
{
A a;
B b;
Array[0] = &a; //Array[]为指向基类对象的指针
Array[1] = &b;
int value = Array[1]->Sum(n);
return value;
}
三 利用函数指针来求解
typedef unsigned int (*fun)(unsigned int); //定义指针类型的函数fun
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); //为n不为0 ,函数指针指向Sum_Solution3,n为0函数指针指向Solution3_Teminator
}
四 利用模板类型求解
n必须在编译期间就能确定,不能动态输入,递归代码深度有限制,n不能太大
template <unsigned int n> struct Sum_Solution4
{
enum Value { N = Sum_Solution4<n - 1>::N + n};
};
template <> struct Sum_Solution4<1>
{
enum Value { N = 1};
};
template <> struct Sum_Solution4<0>
{
enum Value { N = 0};
};
每个实例化都会调用构造函数,同时静态变量使得变量只有一个副本,每次实例化后值的改变影响一直存在。
class Temp
{
public:
Temp(){++n;sum+=n;} //++n从1开始
static void Rest(){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 sum1(unsigned int n)
{
Temp::Rest(); //再次调用时初始化
Temp *p=new Temp
(); //()表示初始化为0
delete[] p; //delete[]只是释放指针所指向的内存空间,指针还是指向空间地址
p=NULL;
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) //virtual可以不使用,因为系统会根据3方面的检查自动确定为虚函数
{
return Array[!!n]->Sum(n-1) + n; //当n不为0时,为Array[1]指向子类的函数,,n为0时,为Array[0],指向基类的函数
}
};
int Sum2(int n)
{
A a;
B b;
Array[0] = &a; //Array[]为指向基类对象的指针
Array[1] = &b;
int value = Array[1]->Sum(n);
return value;
}
三 利用函数指针来求解
typedef unsigned int (*fun)(unsigned int); //定义指针类型的函数fun
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); //为n不为0 ,函数指针指向Sum_Solution3,n为0函数指针指向Solution3_Teminator
}
四 利用模板类型求解
n必须在编译期间就能确定,不能动态输入,递归代码深度有限制,n不能太大
template <unsigned int n> struct Sum_Solution4
{
enum Value { N = Sum_Solution4<n - 1>::N + n};
};
template <> struct Sum_Solution4<1>
{
enum Value { N = 1};
};
template <> struct Sum_Solution4<0>
{
enum Value { N = 0};
};
相关文章推荐
- 剑指offer 面试题46:求1+2+3+...+n(不能使用乘除法、循环语句及条件判断语句) 题解
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)和不用循环/goto/递归输出1~100的10种写法
- java基础条件判断循环语句
- 求1+2+。。。+n,不用乘除,for、while、if、else、switch、case等关键字及条件判断语句
- 输入三个数,用条件表达式,不能用if语句,判断是不是两个奇数一个偶数,是就输出Y,不是就输出N。
- 条件判断 & 循环语句的逆向
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
- Java实现1+2+...+n,不用乘除符号,不用if等条件判断,不用for等循环
- 求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字 以及条件判断语句(A?B:C)
- 条件判断 & 循环语句的逆向
- 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- Python While循环语句 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为: while 判断条件:
- JS基础知识(上)(变量,条件判断语句,循环语句,函数,对象,数组)
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
- shell脚本编写 之 条件选择,条件判断,循环语句
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- Java 控制语句:循环、条件判断
- 作业3(4)循环输入多个年份 year,判断该年是否为闰年。判断闰年的条件是:能被 4 整除但不能被100 整除,或者能被 400 整除。输入-1退出程序执行
- 【c语言】不能使用循环语句和判断语句,求1-100所有整数的和
- 1119 如果循环变量是自减变化,警惕限制语句不能有==0的条件