비교문 없는 프로그램으로 작은 수 구하기

kmhh0021의 이미지

if문이나 ?연산자를 사용하지 않고 0을 제외한 두 자연수중 작은 수를 구하는 방법이 있을까요.

Prentice의 이미지

while (){} loop 이나 do {} while (); loop은 어떨까요?

while (a > b) {
printf("%d", b);
break;
}

while (a <= b) {
printf("%d", a);
break;
}
kmhh0021의 이미지

저도 지금 고민 중인 문제인데..

while이나 loop등의 반복문도 그 내부에 if로 반복을 제어하는거라서 사용이 안됩니다.


-------------------------------------------
피바다=피받아
http://blood.egloos.com
[一笑一少 一怒一老]
[笑門萬福來]

sangwoo의 이미지

#include <stdlib.h>

int
min(int a, int b)
{
    return (a + b - abs(a - b) ) / 2;
}

PS. 근데 사실 abs() 구현 안에 ? 있어요.. -_-

----
Let's shut up and code.

ohhara의 이미지

이런거 찾으시는거 맞죠? optimize를 할 때 흔히 사용되는 듯 하더군요.

static int int_max(int a, int b) {
b = a-b;
a -= b & (b>>31);
return a;
}

static int int_abs(int a) {
return a - ((a+a) & (a>>31));
}

static int int_min(int a, int b) {
b = b-a;
a += b & (b>>31);
return a;
}

Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com

pynoos의 이미지

kmhh0021 wrote:
if문이나 ?연산자를 사용하지 않고 0을 제외한 두 자연수중 작은 수를 구하는 방법이 있을까요.

비교하지 않고 비교한다는 괘변 문제군요.

일단 무조건 앞에 것을 답이라 취합니다.
(모집단이 bound되어 있지 않으면, 50%의 확률로 정답입니다.)

............

1. 비교가 내재된 statement, operator를 사용하지 않아야한다.
2. 1번을 사용하지 않은 라이브러리 함수이어야한다.

뭐.. 이런 제약이 있는 것인가요?

rOseria의 이미지

제꺼는 이렇거든요. 프로그램 짜고 있는 동안 답글이 달리다니 - 역시 세상은 빠르군요 .

Quote:

#include <stdio.h>

int main()
{
int number[2];
printf("두 수를 입력.\n");
scanf("%d %d", &number[0], &number[1]);

int s = number[1] - number[0];
int e = ( s & 0x80000000 ) >> 31; // int는 32bit

printf("작은 수는 %d 입니다.",number[e]);
return 0;
}

----
한 발자국, 한 발자국 - 언젠가는 도약하리라 ~

kmhh0021의 이미지

int a = 4; // a=8
int b = 8; // b=4
int mul = a * b;
int c = (a + mul) / (b + mul);
int d = (b + mul) / (a + mul);
int e = b * c + a * d;
System.out.println(e);


-------------------------------------------
피바다=피받아
http://blood.egloos.com
[一笑一少 一怒一老]
[笑門萬福來]

sangwoo의 이미지

kmhh0021 wrote:
int a = 4; // a=8
int b = 8; // b=4
int mul = a * b;
int c = (a + mul) / (b + mul);
int d = (b + mul) / (a + mul);
int e = b * c + a * d;
System.out.println(e);

a == b 일때 성립하지 않습니다.
PS. 하긴 '작은' 것을 구하는 거니까 a == b인 경우는 undefined겠군요;;

----
Let's shut up and code.

cheezy의 이미지

Element Comparison 기반이 아닌 정렬 알고리즘이 있으니 비교하지 않고 비교한다는 것이 가능.

Found Myself.

sangwoo의 이미지

cheezy wrote:
Element Comparison 기반이 아닌 정렬 알고리즘이 있으니 비교하지 않고 비교한다는 것이 가능.

와앗 +_+ 어떻게 가능한가요? 궁금.. 레퍼런스를 알려주실 수 있으신지..

----
Let's shut up and code.

kmhh0021의 이미지

int a = 4;
int b = 8;
int mul = a * b;
int c = (a + mul) / (b + mul);
int d = (b + mul) / (a + mul);
//int e = b * c + a * d; //같은수 비교불가능

int e = b * c + a * d - (a + b) * (c * d) / 2; // 같은수 비교 가능
이렇게 하면 같은 값에 대해서 처리가 됩니다.

sangwoo wrote:

a == b 일때 성립하지 않습니다.
PS. 하긴 '작은' 것을 구하는 거니까 a == b인 경우는 undefined겠군요;;


-------------------------------------------
피바다=피받아
http://blood.egloos.com
[一笑一少 一怒一老]
[笑門萬福來]

naisr00t의 이미지

ohhara wrote:
이런거 찾으시는거 맞죠? optimize를 할 때 흔히 사용되는 듯 하더군요.

static int int_max(int a, int b) {
b = a-b;
a -= b & (b>>31);
return a;
}

static int int_abs(int a) {
return a - ((a+a) & (a>>31));
}

static int int_min(int a, int b) {
b = b-a;
a += b & (b>>31);
return a;
}

오하라님 코드 설명좀 해주세요.

비트 연산에 대해 취약사병이라 ^^;
다른 것두 취약하지만....

하드웨어 관련 프로그래밍을 해야 되서리.
비트 관련 프로그래밍을 언젠가 한번은(?)은 쓸 것 같거든요.

쌩초짜 플머입니다.