题面:求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
这道题完全不知道想考啥,所以一开始写了个乱搞算法(其实是借鉴了计算机算乘法的方法)
class Solution {
public:
unsigned int build(int u) {
unsigned int ret=u;
ret|=ret<<1;
ret|=ret<<2;
ret|=ret<<4;
ret|=ret<<8;
ret|=ret<<16;
return ret;
}
int sumNums(int n) {
unsigned int a[14];
unsigned int ans=0;
a[0]=n;
a[1]=a[0]+a[0];
a[2]=a[1]+a[1];
a[3]=a[2]+a[2];
a[4]=a[3]+a[3];
a[5]=a[4]+a[4];
a[6]=a[5]+a[5];
a[7]=a[6]+a[6];
a[8]=a[7]+a[7];
a[9]=a[8]+a[8];
a[10]=a[9]+a[9];
a[11]=a[10]+a[10];
a[12]=a[11]+a[11];
a[13]=a[12]+a[12];
n=n+1;
ans+=build(n&(1<<0))&a[0];
ans+=build(n&(1<<1))&a[1];
ans+=build(n&(1<<2))&a[2];
ans+=build(n&(1<<3))&a[3];
ans+=build(n&(1<<4))&a[4];
ans+=build(n&(1<<5))&a[5];
ans+=build(n&(1<<6))&a[6];
ans+=build(n&(1<<7))&a[7];
ans+=build(n&(1<<8))&a[8];
ans+=build(n&(1<<9))&a[9];
ans+=build(n&(1<<10))&a[10];
ans+=build(n&(1<<11))&a[11];
ans+=build(n&(1<<12))&a[12];
ans+=build(n&(1<<13))&a[13];
return (int)ans>>1;
}
};
看了评论区的题解之后,发现其实还是可以用递归的,虽然不能用if,但可以用&&来实现if的作用(做这道题之前完全没想过if和&&还能这么扯上关系),然后也自己写了一下:
class Solution {
public:
int sumNums(int n) {
int ret=n;
n&&(ret+=sumNums(n-1));//若n为0,则不会执行后面的语句,递归结束;
return ret;
}
};