方法一:利用构造函数和静态数据成员
#include <iostream>
using namespace std;
class Temp
{
public:
Temp()
{
++N;
Sum+=N;
}
static void Reset()
{
N=0;
Sum=0;
}
static int GetSum()
{
return Sum;
}
private:
static int N;
static int Sum;
};
int Temp::N=0;
int Temp::Sum=0;
int solution_Sum(int n)
{
Temp::Reset();
Temp *a=new Temp[n];
delete []a;
a=0;
return Temp::GetSum();
}
int main()
{
cout<<solution_Sum(100)<<endl;
return 0;
}
方法二:利用虚函数
#include <iostream>
using namespace std;
class A;
A* Array[2];
class A
{
public:
virtual int Sum(int n)
{
return 0;
}
};
class B:public A
{
public:
virtual int Sum(int n)
{
return Array[!!n]->Sum(n-1)+n;
}
};
int solution2_Sum(int n)
{
A a;
B b;
Array[0]=&a;
Array[1]=&b;
int value=Array[1]->Sum(n);
return value;
}
int main()
{
cout<<solution2_Sum(100)<<endl;
return 0;
}
利用函数指针
#include <iostream>
using namespace std;
typedef int (*fun)(int);
int solution_f1(int i)
{
return 0;
}
int solution_f2(int i)
{
fun f[2]={solution_f1, solution_f2};
return i+f[!!i](i-1);
}
void main()
{
cout<<solution_f2(100)<<endl;
}
三。利用&&的短路特性
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int add_fun(int n, int &sum)
{
n && add_fun(n-1, sum); //当n!=0自减 执行n-1,指导n为0 则执行sum+=n ,同时n自加
return (sum+=n); //求出的2数和
}
int main()
{
int sum=0;
int n=100;
printf("1+2+3+...+n=%d\n",add_fun(n, sum));
return 0;
}
四、找高斯。
五、
main()
{
long n=100,sum=0,i=0;
again:
i==n? printf("%l",sum):sum+=++i;
goto again;
}
下面说说逻辑运算符的混合运算:
1、x=y=z=0;
c=++x||++y&&++z;
printf("x=%d,y=%d,z=%d",x,y,z);
结果:x=1,y=0,z=0
解释:由于第一个是“或”运算符,当++z为1时,它具有短路特性,屏蔽掉后面的运算符。
2、x=y=z=0;
c=(++x||++y)&&++z;
printf("x=%d,y=%d,z=%d",x,y,z);
结果:x=1,y=0,z=1
解释:由于在c的左边的逻辑表达式中的第一项含有“()”,所以(++x||++y)作为一个整体——作为一个数,所以先算括号里面的,然后由于“&&”的运算符的特性,再算++z,而对于括号里的再由于“||”的短路特性,只算了“++x”,由于它为“1”,所以“++y”就被屏蔽了。
3、x=y=0
c=x&&++y||++z;
结果:c=1,x=0,y=0,z=1
解释:注意逻辑运算符的运算顺序是自左向右,所以对于左边第一个“&&”运算符,首先算出它的逻辑值,再和后面的“||”运算,作为c的结果。根据优先级的顺序和“&&”的短路特性,由于开始x=0,则整个“&&”的逻辑表达式的逻辑值就是0,而且++y也被屏蔽掉了,再由于后面的“||”的特性,根据++z,可知c=1,z=1。
4、x=y=z=0;
c=x||++y&&z;
结果:c=0,x=0,y=1,z=0
解释:如果“||”前为“ 1”,则整个表达式即c=1;若“||”
前为“0”时,那么根据“||”的特性,该表达式的值由后面的逻辑值确定。对于后面的逻辑表达式,根据“&&”的特性,由于++y=1而z=0,可知c=0,y=1。
5、x=y=z=0;
c=x||++y&&++z;
结果:c=1,x=0,y=1,z=1
解释:结合上一题可知,由于x=0,则该表达式的值由后面的表达式确定,根据“&&”的特性,由于“++y”的值为“ 1”,则继续再算“&&”后面的“++z”,由于“++z”的值也为“1”,所以c=1,y=1,z=1。
6、x=y=z=0;
c=x&&++y&&++z;
结果:c=0,x=0,y=0,z=0
解释:首先根据运算符的优先级,运算从左至右,对于第一个“&&”,由于x=0,则这个逻辑运算符的逻辑值为“0”,且屏蔽了后面的“++y”。再于逻辑运算符的逻辑值为“0”且后面为“&&”,根据它的短路特性后面的“++z”被屏蔽了。所以整个表达式的值即c=0,x=0,y=0,z=0。
最后,总结一下关于类似c=++x&&++y||++z这类任何形式的逻辑表达试,均相当于c=(++x&&++y)||++z,但同时要结合其“&&”、和“||”不同的短路特性以及其内部的短路特性,可以正确地算出其逻辑值。