제약 조건 하에서 자신의 함수로 계산기 만들기
//기본 제공 함수 1
bool Equal (int a, int b)
{
if(a == b) return true;
else return false;
}
//기본 제공 함수 2
int PlusOne (int a)
{
return ++a;
}
Constraints :
1. 코드 내에 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 부등호( >또는 < ) 및 등호(==)는 존재하지 않아야 함
2. 오로지 위의 함수 2개만 존재하며, 함수를 만들어 나갈 수만 있음
3. 본인이 작성한 C또는 CPP파일을 위의 기본 파일과 함께 Link 하였을 때 에러 없이 돌아갈 수 있어야 함 (extern 처리를 모르는 학생의 경우라면 위의 함수를 자신의 파일에 포함하여도 무방)
4. 개발 언어는 굳이 C일 필요는 없으므로 타 언어로 개발 시 위와 같은 함수 2개를 미리 작성 후 그것만을 이용하여 작성할 것 (개인적으로 Scheme 언어 강추)
5. 위에서 제공된 2개의 함수를 기반으로 하여 함수를 만들어가면서 4칙연산을 위한 코드를 작성하되 아래의 Interface를 따를 것 (음수 처리 되어야 함)
int Plus (int a, int b);
int Min (int a, int b);
int Mul (int a, int b);
int Div (int a, int b);
6. Hint !!! 예를 들어 3+2의 연산이라면 3이라는 숫자에 2번을 PlusOne 하여 처리
단, 이 때 for 문 안에서도 < 표시나 ++ 같은 기호는 사용 불가
호기심에 교양으로 C언어를 듣게 되었는데(전공은 문과쪽;;) 어떻게든 제 힘으로 해보고자 애썼지만 지능의 부족으로 결국 질문하게 되었네요.
6번 힌트를 보고 될 것도 같았는데 for문 안에서 <나 ++를 사용하지 말고 어떻게 하라시는 건지... for(int a=0; a<10; a++) 이 정도 밖에 모르는 저인데
말이죠ㅠ.ㅠ
뺄셈 같은 것은 5-3이라고 하면 3에서 2번 1을 더해야 5가 되지 않습니까? 그 "2"번을 출력하면 될 것도 같은데 음수처리는 어떻게 해야할지도 고민이고
곱셈은 3*2라고 하면 3+3... 먼저 입력한 수를 두 번째 입력한 수만큼 더하면 될 것 같은데 for문안에서 <와 ++를 사용하지 말라는 조건이 역시 걸리네요.
뺄셈이 덧셈의 뒤집기(?) 같은 거니까 나눗셈은 곱셈의 뒤집기를 하면 될 것 같은데, 사실 정확한 감은 안 잡히네요.
조언 부탁드립니다.(아이디어라도 말씀해 주시면 감사하겠습니다.)
(예전에 본 것 같기도 한데 가물가물...)
어쨌든 비트 연산이 필요한 문제입니다.
오래 보고 있진 못하니 도움이 될 만한 것 몇 가지만 말씀 드리면,
1. 양수 <-> 음수로 바꾸는 법
: a=~a; a=PlusOne(a); //2's Complement(2의 보수)의 양수<->음수 변환입니다.
2. 양수, 음수 구별법
: Equal(a>>31,0)
: int는 32비트 정수입니다. 그리고 제일 끝(MSB), 32번째 비트는 부호를 나타냅니다.
: 이게 0이면 양수, 1이면 음수죠.
: 이것을 오른쪽으로 31비트 쉬프트하면 원래 숫자에서 32번째 비트 하나(부호)만이 남습니다.
: 즉, 이것을 0과 비교해서 같으면 양수, 다르면 음수겠죠.
: 예를 들면 이렇습니다.
if( Equal(a>>31,0) ) printf("a는 양수");
else printf("a는 음수")
3. for문이나 while문이나, 조건식이 0일 때만 빠져나온다는 것을 기억하세요.
: 조건식의 결과가 100이건 -100이건 루프는 계속 반복 됩니다.
: 앞서 이야기한 양수<->음수 변환과 PlusOne을 같이 쓰면 문제 없을 겁니다.
4. ++를 쓰지 말라는 것은 걸릴 이유가 없습니다.
: a++와 a=PlusOne(a)의 결과는 그 다음 줄에선 같죠 (...)