최종 소스 !! 교수님께서 가장 빠르게 돌리는 사람에게 좋은 학점을 주신다 하셔서
스레드를 추가했다.
나는 mac 을이용해서 비주얼스튜디오의 스레드는 못쓰는관계로 ㅜㅜ pthread 를 이용하여 구현하였다
내꺼 속도가 꽤 빨라서 잘되길 바람!!!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void *Divthr(void *data);
bool Equal(int a, int b);
int PlusOne (int a);
int Plus(int a, int b);
int Min (int a, int b);
int Mul(int a, int b);
int* Div(int a, int b);
char Buho (int a);
int Pl_buho(int a, int b); //덧셈뺄셈 부호
int Mul_buho(int a, int b); // 곱셈나눗셈 부호
int budngho(int a, int b);
int main(void)
{
pthread_t div_thread;
int thr[2];
int *divresult;
int a,b;
unsigned int buho_input;
char div_buho; //나눗셈 나머지 몫과 부호 호출을 한번만 하기위해 변수 지정
unsigned int buho_count;
unsigned int result;
unsigned int a_bu,b_bu;
printf("첫번째 수 부호와 숫자를 입력하세요(0.+ 1.-),자연수 :");
scanf("%d %d",&a_bu,&a);
printf("두번째 수 부호와 숫자를 입력하세요(0.+ 1.-),자연수 :");
scanf("%d %d",&b_bu,&b);
printf("연산을 정하세요 1.+ 2.- 3.* 4./ :");
scanf("%d",&buho_input);
switch (buho_input) {
case 1:
buho_count = Pl_buho(a_bu, b_bu);
if(Equal(buho_count,0)) //부호가 같을때 + 연산
{
buho_count = 0;
result = Plus(a,b);
}
else if (Equal(buho_count, 1)) //부호가 같을때 - 연산
{
buho_count = 1;
result = Plus(a,b);
}
else{ //부호가 다를때 연산
if(Equal(budngho(a, b),0)){//부등호 a가더크면 0 b 가 더크면 1
result= Min(a, b);
if (Equal(buho_count,2 ))
buho_count = 0;
else
buho_count= 1;
}
else
{
result= Min(b, a);
if(Equal(buho_count,2))
buho_count = 1;
else
buho_count = 0;
}
}
printf("답 :%c%d\n",Buho(buho_count) ,result);
break;
case 2:
buho_count = Pl_buho(a_bu, b_bu);
if(Equal(buho_count,2)) //부호가 다를때 앞에 수가 +
{buho_count = 0;
result = Plus(a,b);
}
else if (Equal(buho_count, 3)) //부호가 다를때 뒤에 수가 +
{
buho_count =1 ;
result = Plus(a,b);
}
else{ //부호가 같을때
if(Equal(budngho(a, b),0)) //부등호 a가더크면 0 b 가 더크면 1
{
result = Min(a,b);
if (Equal(buho_count,0))
buho_count = 0;
else
buho_count= 1;
}
else
{
result = Min(b,a);
if (Equal(buho_count,1))
buho_count = 0;
else
buho_count= 1;
}
}
printf("답 :%c%d\n",Buho(buho_count) ,result);
break;
case 3:
if(Equal(a, 0))
{
printf("답:0\n");
}
else if(Equal(b,0)){
printf("답:0\n");
}
else
{ buho_count = Mul_buho(a_bu, b_bu);
result = Mul(a, b);
}
printf("답 :%c%d\n",Buho(buho_count) ,result);
break;
case 4:
thr[0] = a;
thr[1] = b;
pthread_create(&div_thread, NULL, Divthr, (void *)&thr);
if(Equal(a, 0))
{
printf("답:0 나머지:0\n");
}
else if(Equal(b,0))
{
printf("답:0 나머지:0\n");
}
else
{
// divresult = Div(a, b);
buho_count = Mul_buho(a_bu, b_bu);
div_buho= Buho(buho_count);
pthread_join(div_thread, (void **)&divresult);
printf("답 :%c%d 나머지:%c%d\n",div_buho,divresult[0],div_buho,divresult[1]);
}
default:
break;
}
getchar();
getchar();
return 0;
}
int Pl_buho(int a, int b)
{
unsigned int i;
if (Equal(a, b))
{
if(Equal(a, 0))
i = 0; //덧셈뺄셈 부호가 같을때 +
else
i = 1; //덧셈뺄셈 부호가 같을때 -
}
else
{
if(Equal(a, 0))
i = 2; //덧셈뺄셈 부호가 다를때 앞수가 +
else
i=3; //덧셈뺄셈 부호가 다를때 앞수가 -
}
return i ;
}
int Mul_buho(int a, int b){
int unsigned i;
if (Equal(a, b))
{
i = 0;
}
else
{
i = 1;
}
return i ;
}
int Plus(int a, int b){
int unsigned i = 0;
while(1)
{
i = PlusOne(i);
b = PlusOne(b);
if(Equal(a, i))
break;
else
continue;
}
return b;
}
int Min (int a, int b){
int unsigned result = 0;
while(1)
{
if (Equal(a, b))
break;
else
result = PlusOne(result);
b = PlusOne(b);
continue;
}
return result;
}
int Mul(int a, int b){
int unsigned i = 0;
int unsigned j = 0,result=0;
while (1) {
while(1)
{
result = PlusOne(result);
i = PlusOne(i);
if(Equal(a, i))
break;
else
continue;
}
j = PlusOne(j);
i = 0;
if(Equal(b, j))
break;
else
continue;
}
return result;
}
int* Div(int a,int b){ // 나눗셈
int unsigned i = 0, namuji = 0;
int unsigned f_b, result = 0;
int unsigned re_mul = 0; // 몫과 b의 곱
int *resnam_sum = (int*)malloc(2) ;
f_b = b; // 초기의 b 값
while (1) {
if(Equal(a, b))
{result = 1;
break;
}
else
result = PlusOne(result);
while(1)
{
i = PlusOne(i);
b = PlusOne(b);
if(Equal(f_b, i))
break;
else
continue;
}
i = 0;
re_mul = Mul(f_b,result); //몫과 b의 곱
namuji = 0;
while(1){ // b 와 몫의 곱에 나머지를 더해줌
namuji = PlusOne(namuji);
re_mul = PlusOne(re_mul);
if (Equal(f_b, namuji))
break;
else if (Equal(a, re_mul))
break;
else
continue;
}
if (Equal(a, re_mul))
break;
else
continue;
}
if(Equal(f_b,namuji))
{resnam_sum[0] = PlusOne(result);
resnam_sum[1] = 0;
}
else
{resnam_sum[0] = result;
resnam_sum[1] = namuji;}
return resnam_sum;
}
void *Divthr(void *data){
int a = *((int* )data);
int b = *((int* )data+1);
int unsigned i = 0, namuji = 0;
int unsigned f_b, result = 0;
int unsigned re_mul = 0; // 몫과 b의 곱
int *resnam_sum = (int*)malloc(2) ;
f_b = b; // 초기의 b 값
while (1) {
if(Equal(a, b))
{result = 1;
break;
}
else
result = PlusOne(result);
while(1)
{
i = PlusOne(i);
b = PlusOne(b);
if(Equal(f_b, i))
break;
else
continue;
}
i = 0;
re_mul = Mul(f_b,result); //몫과 b의 곱
namuji = 0;
while(1){ // b 와 몫의 곱에 나머지를 더해줌
namuji = PlusOne(namuji);
re_mul = PlusOne(re_mul);
if (Equal(f_b, namuji))
break;
else if (Equal(a, re_mul))
break;
else
continue;
}
if (Equal(a, re_mul))
break;
else
continue;
}
if(Equal(f_b,namuji))
{resnam_sum[0] = PlusOne(result);
resnam_sum[1] = 0;
}
else
{resnam_sum[0] = result;
resnam_sum[1] = namuji;}
return (void**)resnam_sum;
}
int budngho(int a, int b){
int unsigned a_pl = a;
int unsigned b_pl = b;
int unsigned budng;
while (1) {
a_pl = PlusOne(a_pl);
b_pl = PlusOne(b_pl);
if (Equal(a,b))
{
budng = 0;
break;
}
else if (Equal(a, b_pl)) /// A>B일때
{ budng = 0;
break;
}
else if(Equal(b, a_pl)) /// B>A일때
{
budng = 1;
//Swap(&a, &b);
break;
}
else
continue;
}
return budng ;
}
//부호 연산 ----------------------------------------------------------
char Buho (int a)
{
char i;
if(Equal(a, 0))
i = '+';
else if(Equal(a, 1))
i = '-';
return i;
}
bool Equal (int a, int b)
{
if(a == b) return true;
else return false;
}
//기본 제공 함수 2
int PlusOne (int a)
{
return ++a;
}
'Programming > Algorithm' 카테고리의 다른 글
1 과 0으로 계산기 만들기 - 2 - (0) | 2016.02.09 |
---|---|
1 과 0으로 계산기 만들기 - 1 - (0) | 2016.02.09 |
1 과 0으로 계산기 만들기 - 0 - (0) | 2016.02.09 |