...
소인수분해 계산기
간단하게 소인수 분해를 계산하는 프로그램을 만들어 올려본다.
코드도 첨부해 뒀으니 하나하나 클론코딩 해보는 것도 나쁘지 않는 방법이다.
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define ESC 0x1b
#define N 20
#define COL GetStdHandle(STD_OUTPUT_HANDLE)
#define BLACK SetConsoleTextAttribute(COL, 0x0000);
#define DARK_BLUE SetConsoleTextAttribute(COL, 0x0001);
#define GREEN SetConsoleTextAttribute(COL, 0x0002);
#define BLUE_GREEN SetConsoleTextAttribute(COL, 0x0003);
#define BLOOD SetConsoleTextAttribute(COL, 0x0004);
#define PURPLE SetConsoleTextAttribute(COL, 0x0005);
#define DARK_YELLOW SetConsoleTextAttribute(COL, 0x0006);
#define WHITE SetConsoleTextAttribute(COL, 0x0007);
#define GRAY SetConsoleTextAttribute(COL, 0x0008);
#define BLUE SetConsoleTextAttribute(COL, 0x0009);
#define LIGHT_GREEN SetConsoleTextAttribute(COL, 0x000a);
#define LIGHT_BLUE SetConsoleTextAttribute(COL, 0x000b);
#define RED SetConsoleTextAttribute(COL, 0x000c);
#define PLUM SetConsoleTextAttribute(COL, 0x000d);
#define YELLOW SetConsoleTextAttribute(COL, 0x000e);
#define LIGHT_WHITE SetConsoleTextAttribute(COL, 0x000f);
void gotoxy(int x,int y);
void ptf(int x, int y,int z);
int great_divisor(int a, int b);//피보나치 알고리즘
int compare(int *x, int *y);//비교 함수
int arr1[N]={0},arr2[N]={0},divisor[10]={0};
int goto_yy,i_end=0,j_end=0;
int main()
{
system("color 0e");//배경색 글자색 설정
system("mode con: cols=53 lines=30");//가로 세로
int i,num1,num2,hit,tmp;
do
{
for(i=0;i<N;i++)
{
arr1[i] = 0;
arr2[i] = 0;
if(i<10)
divisor[i]=0;
}
goto_yy=0;
i_end=0,j_end=0;
printf(" [ 두 수를 소인수분해하여 공약수를 구하는 프로그램 ]\n");
printf(" >> 5자리수 까지 지원합니다.\n\n");
printf(" 공약수를 구할 두 수 입력 : [ ]\n");
printf(" [ ]");
gotoxy(29,3);
scanf("%d", &num1);
gotoxy(29,4);
scanf("%d", &num2);
system("cls");
tmp = great_divisor(num1,num2);
gotoxy(2,1);
printf(" %5d", num1);
for(i=2;i<=num1;i++)
{
while(1)
{
if(num1%i == 0)
{
ptf(i,num1/i,2);
num1 /= i;
}
else
break;
}
}
gotoxy(20,1);
printf(" %5d", num2);
for(i=2;i<=num2;i++)
{
while(1)
{
if(num2%i == 0)
{
ptf(i,num2/i,20);
num2 /= i;
}
else
break;
}
}
gotoxy(0,goto_yy+2);
/*
오류검진
for(i=0;i<N;i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%d ", arr2[i]);
}*/
compare(arr1,arr2);
/*printf("\n");
for(i=0;i<10;i++)
printf("%d ", divisor[i]);
printf("\n\n\n");
*/
printf("소인수 곱으로 구한 최대공약수 : ");
for(i=0;i<10;i++)
{
if(divisor[i] != 0)
{
printf("%d * ", divisor[i]);
}
}
printf("\b\b= %d\n", compare(arr1,arr2));
printf("피보나치 수로 구한 최대공약수 : %d\n", tmp);
printf("공약수 : ");
for(i=1;i<=tmp;i++)
{
if(tmp % i == 0)
{
printf("%d ", i);
}
}
puts("\n\n>>다시하려면 아무 키를 누르세요.\n>>종료하시려면 Esc를 누르세요.");
hit = getch();
system("cls");
}while(hit != ESC);
system("pause");
return 0;
}
void ptf(int x, int y, int z)
{
static int goto_y=1;
if(i_end<N && z == 2)
{
arr1[i_end] = x;
i_end++;
}
if(j_end<N && z == 20)
{
arr2[j_end] = x;
j_end++;
}
gotoxy(z,goto_y);
printf("%5d┃", x);
goto_y++;
gotoxy(z+5,goto_y);
printf("┗━━━");
goto_y++;
gotoxy(z+7,goto_y);
printf("%5d", y);
if(y==1)
{
if(goto_yy < goto_y)
goto_yy = goto_y;
goto_y = 1;
}
}
int compare(int *x, int *y)
{
int i,j,cum=1;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(x[i] == y[j])
{
if(x[i] != 0)
{
divisor[i] = x[i];
y[j] = 0;//중요
break;
}
else
break;
}
}
}
for(i=0;i<10;i++)
{
if(divisor[i] != 0)
cum *= divisor[i];
}
return cum;
}
int great_divisor(int a, int b)//피보나치를 이용한 최대공약수 알고리즘
{
if(a>b)
{
while(1)
{
int c;
c = a%b;
a=b;
b=c;
if(b==0)
break;
}
return a;
}
else
{
while(1)
{
int c;
c = b%a;
b=a;
a=c;
if(a==0)
break;
}
return b;
}
}
void gotoxy(int x,int y)
{
COORD Cur;
Cur.X=x;
Cur.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Cur);
}
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.