[프로그래밍 제목] 1+2+...+n을 구하고, 곱셈법, for,while,if,else,switch,case와 조건문을 사용할 수 없음을 요구합니다.
14720 단어 switch
나중에 아주 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C++ da Switch case 'Tanlash operatori'스위치 케이스 asosan bir nechta qiymatdan, o'zgaruvchiga mos qiymatni tanlashda va qiymatga mos ravishda boshqarishni amalga o...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.