본문 바로가기

Programming/Algorithm

1 과 0으로 계산기 만들기 - 3 -

최종 소스 !! 교수님께서 가장 빠르게 돌리는 사람에게 좋은 학점을 주신다 하셔서 

스레드를 추가했다.

나는 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, NULLDivthr, (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;

}