세상 사는 이야기

쉬프트 연산으로 팩토리얼 계산을 짜보았습니다. 날짜:2020-2-23 4:34:49 조회수:71
작성자 : henrietta
포인트 : 62
가입일 : 2020-02-22 18:58:56
방문횟수 : 52
글 7개, 댓글 17개
소개 :
작성글 보기
쪽지 보내기
#include <Turboc.h>
#include <stdio.h>

int main(){
    unsigned int sum;
    unsigned int i,j,k,p,l,input;
    p=1,j=1,k=2,l=1;sum=1;
    
    for(;;){
        p=0,j=1,k=2,l=1;sum=1;
        printf("\n12 이하의 정수를 입력하세요.\n");
        scanf("%d",&input);
        
        for(i=1;i<=input;i++){
            
            if(i==k){
                p=j;
                sum=sum<<j;
                printf("if / i=%d / j=%d sum = %d\n",i,j,sum);
                k=k<<1;
                j+=1;
                l=1;
                
            }
            else if(i!=1){
                sum=(sum<<p)+(sum*l);
                printf("else / i=%d / l=%d / sum = %d\n",i,l,sum);
                l+=1;
            }
                
        }
            printf("\n%d의 팩토리얼은 %d 입니다.",input,sum);    
    }
}



쉬프트 연산 강좌를 보고 삘을 딱 받아서 한 번 짜보았습니다.
간단한 내용인데도 3! 이 6이 아니라 12가 나오는 둥 많이 헤멨습니다.
중간중간의 printf는 for문 안에서 변수가 어떻게 돌아가는지 보려고 넣었습니다.
분명 더 간략하게도 할 수 있을 것 같은데... 음.. 지금으로선 모르겠네요.

목록보기 삭제 수정 신고 스크랩

소엔 2월25일 9:13:12  

잘 동작하기는 하지만 불필요한 변수가 좀 많이 있습니다. 2의 거듭승이 아니므로 쉬프트 연산은 굳이 필요치는 않고 그냥 단순 곱셈을 쓰면 될 거 같구요. 입력 받을 때 개행은 하지 않는 편이 보기 좋고 무한 루프를 끝낼 방법이 있어야 하니 0 입력시 루프를 빠지는 코드도 있으면 좋겠습니다.

#include <stdio.h>

int main() {
 int sum, input;

 for (;;) {
  printf("\n12 이하의 정수를 입력하세요. : ");
  scanf("%d", &input);
  if (input == 0) break;

  sum = 1;
  for (int i = 1; i <= input; i++) {
   sum = sum * i;
  }
  printf("\n%d의 팩토리얼은 %d 입니다.", input, sum);
 }
}

이 정도 길이면 될 거 같네요. 문제를 푸는 방법은 여러 가지가 있으니 이런 저런 코드를 비교해 보세요.


로그인하셔야 댓글을 달 수 있습니다.