[프로그래밍 제목] 1+2+...+n을 구하고, 곱셈법, for,while,if,else,switch,case와 조건문을 사용할 수 없음을 요구합니다.

14720 단어 switch
이 문제를 보고 첫 번째 반응은 정말 변태였다.그리고 직감은 순환을 할 수 없고 귀속을 할 수밖에 없다.그런데 어떻게 튀어나왔는지 골치 아픈 일이 생겨서 나는 goto 문장도 고려하지 못했다.
나중에 아주 NC적인 방법이 생각났어요. 표를 찾는 거예요.만약 n이 비교적 작은 범위를 한정한다면 직접 검색표로 하면 된다.하지만 문제의 목적은 그렇지 않을 거야...
나중에 생각을 바꿨어요. 1+2...+n=(n*n+n)>>1은 n*n만 요구하면 되지만 문제는 곱셈을 사용할 수 없다는 것이다. 그래서 하드웨어 출신인 나는 2진법 &, |, >, <모두 사용할 수 있다.
생각: n = 5를 설정하면 n = 1 0 1 b. n * n =
            1 0 1
*          1 0 1
--------------------
           1 0 1         5
        0 0 0
     1 0 1                20
--------------------- 
     1 1 0 0 1         25
 
우리는 단지 중간 단락의 수를 구하여 합치면 된다.코드 구현 중, for 를 쓸 수 없기 때문에, 나 는 스스로 너무 많은 덧셈 을 쓰는 것 을 귀찮아서, n 의 수치 범위 를 0-255 로 설정할 수 밖에 없다
/*

 :   1+2+3+...+n

 :    if else for while switch case ?:

*/

#include <stdio.h>



const unsigned char b[16] = {1, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7, 1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15};



int get_add_factor(unsigned char n, unsigned char onebit)

{

     unsigned char b = onebit + (onebit<<1) + (onebit<<2) + (onebit<<3) + (onebit<<4) + (onebit<<5) + (onebit<<6) + (onebit<<7);

     return n&b;

}



int addn(unsigned char n)

{

    unsigned char bits[8] = {n&b[0], (n&b[1])>>1, (n&b[2])>>2 ,(n&b[3])>>3, (n&b[4])>>4, (n&b[5])>>5, (n&b[6])>>6, (n&b[7])>>7};  // 

    int tmp[8] = {get_add_factor(n, bits[0]), get_add_factor(n, bits[1])<<1, get_add_factor(n, bits[2])<<2, get_add_factor(n, bits[3])<<3,

                  get_add_factor(n, bits[4])<<4, get_add_factor(n, bits[5])<<5, get_add_factor(n, bits[6])<<6, get_add_factor(n, bits[7])<<7};



    int pow = tmp[0] + tmp[1] + tmp[2] + tmp[3] + tmp[4] + tmp[5] + tmp[6] + tmp[7];

    int ans = (pow + n) >> 1;

    return ans;    

}



int main()

{

    //addn   0 - 255

    int r = addn(255);



    return 0;

}

 
그리고 인터넷에 가서 다른 사람의 답안을 보고 나는 놀랐다.이렇게 다양한 방법이 있었구나.
가장 감탄스러운 것은 다음 버전: 논리와 & & & 특성을 이용하여 순환을 성공적으로 뛰어넘었다는 것이다
#include <stdio.h>  

#include <stdlib.h>  

#include <string.h>  

  

int add_fun(int n, int &sum)  

{  

    n && add_fun(n-1, sum);  //         

    return (sum+=n);  

}  

  

int main()  

{  

    int sum=0;  

    int n=100;  

  

    printf("1+2+3+...+n=%d
",add_fun(n, sum)); return 0; }

 
 
방법3: 클래스의 정적 변수를 이용하여 구조 함수에서 정적 변수에 대해 덧셈을 하여 여러 클래스의 대상을 구축하여 화합을 실현한다
#include <iostream>

using namespace std;



class Temp

{

public:

    Temp()

    {

        N++;

        SUM+=N;

    }

    static int GetSum()

    {

        return SUM;

    }

    static void Reset()

    {

        N = 0;

        SUM = 0;

    }

    ~Temp(){};

private:

    static int N;

    static int SUM;

}; //   



// 

int Temp::N = 0;

int Temp::SUM = 0;



int Sum(int n)

{

    Temp::Reset();

    Temp * a = new Temp[n];

    delete [] a;

    

    return Temp::GetSum();

}

int main()

{

    int a = Sum(100);

    return 0;

}

 
방법4 함수 바늘을 이용한다.함수 바늘을 교묘하게 정의한 수조가 i=0일 때!!i=0, 다른 경우!!i=1 이 규칙을 이용하여 귀속
#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);  

}  

  

int main()  

{  

    cout<<solution_f2(100)<<endl;  

    return 0;

} 

 
또 하나의 방법 5 허함수의 구체적인 사상을 이용하는 것은 사실 함수 바늘과 매우 비슷하다. 왜냐하면 나는 허함수를 잘 수학하지 못하기 때문에...
#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;  

}

좋은 웹페이지 즐겨찾기