1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句

6 篇文章 0 订阅

方法一:利用构造函数和静态数据成员


#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,但同时要结合其“&&”、和“||”不同的短路特性以及其内部的短路特性,可以正确地算出其逻辑值。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值