상세 컨텐츠

본문 제목

C 언어 예제, 1000 의 자리수를 갖는 수의 계산

컴퓨터 관련/C 언어 예제

by 열정과 함께 2014. 1. 23. 03:44

본문

문제는 이렇다.


--> 1000의 자리수를 갖는 수들의 사칙연산을 수행한다. 단, 걸리는 시간은 1초 이내


언뜻 보면 계산기가 아닌가, 싶기도 한데 그렇지 않다. 정수를 정의하는 int, double, float 중 무엇으로도 1000 의 자리수는 정의가 안된다. 각설하고 일단 아래의 그림처럼 만들라는 것이다. 뭐 bigint 나 biginteger??? 라고 부르기도 하는 모양이더라.



0 이 매우 많다. 일단 아래에는 몇가지 특징이 있으니


1. 일단 1000 의 자리수의 계산이라는 목적에 맞도록, 수를 무조건 1000 자리를 다 채워지게 만들었다.

2. 소수점을 표현을 안 했다. 그거 하려면 빡칠거 같아서....

3. 반복 계산은 안 했다. 일단 연산 자체에만 충실하도록. 안 그래도 0이 무수히 찍히는데.....


기본적인 개념은 이렇다. 뭐, 정의 가능한 범위를 벗어나는 수라면 그냥 순서대로 숫자를 마구 찍어주면 될 것이 아닌가? 그냥 무식하게 계산해서 다 찍어 주는 거다.


아래는 코드


/* 1000 의 자리수의 사칙연산이 가능한 프로그램을 만든다. 단, 연산에 필요한 시간은 1초 이내 */

#include <stdio.h>

int define_var(int *var3, int a);

int var_plus(int *var1, int *var2, int *var_result);

int var_minus(int *var1, int *var2, int *var_result);

int var_multiple(int *var1, int *var2, int *var_result);

int var_divide(int *var1, int *var2, int *var3, int *var_result);

int main()

{

int number[10] = {0,1,2,3,4,5,6,7,8,9};

char operation;

int var1[1000], var2[1000], var3[1000];

int *p, *q;

int var_result[2000];

int a, b, c, d;


printf("숫자를 입력해주십시오. 단, 가장 낮은 자리 숫자부터 입력됩니다. \n 입력을 중단하려면 10 을 입력하십시오. 10 을 입력할 경우 뒤에 0 이 붙습니다. \n");

printf("첫 번째 변수를 입력합니다. \n");

for(a=0;a<1000;a++)

{

scanf("%d", &var1[a]);

var3[a] = var1[a];

if(var1[a] == 10)

{

define_var(var3, a);

for(b=0;b<1000;b++)

{

var1[b] = var3[b];

}

break;

}

}

printf("두 번째 변수를 입력합니다. \n");

for(a=0;a<1000;a++)

{

scanf("%d", &var2[a]);

var3[a] = var2[a];

if(var3[a] == 10)

{

q = &a;

define_var(var3, a);

for(b=0;b<1000;b++)

{

var2[b] = var3[b];

}

break;

}

}

printf("수행할 연산은 무엇입니까? 단, 첫 번째 변수가 연산 부호의 왼쪽에 들어갑니다. \n");

scanf(" %c", &operation);

if(operation =='+')

{

var_plus(var1, var2, var_result);

printf("두 수의 합은 다음과 같습니다. \n");

if(var_result[1000] != 0)

{

printf("%d", var_result[1000]);

}

printf("%d", var_result[999]);

for(a=0;a<999;a++)

{

printf("%d", var_result[998-a]);

}

}

else if(operation =='-')

{

var_minus(var1, var2, var_result);

printf("뺄셈의 결과입니다. \n");

for(a=0;a<1000;a++)

{

printf("%d", var_result[999-a]);

}

}

else if(operation =='*')

{

var_multiple(var1, var2, var_result);

printf("곱셈의 결과입니다. \n");

for(a=0;a<2000;a++)

{

if(var_result[1999-a] != 0)

{

b = 1999-a;

break;

}

}

for(a=0;a<b;a++)

{

printf("%d",var_result[b-a]);

}

}

else if(operation =='/')

{

var_divide(var1, var2, var3, var_result);

for(a=0;a<1000;a++)

{

if(var_result[999-a] != 0)

{

b = 999-a;

break;

}

}

printf("몫 : %d \n", var1[0]);

printf("나머지 : ");

for(a=0;a<b;a++)

{

printf("%d", var_result[b-a]);

}

}

return 0;

}

int define_var(int *var3, int a)

{

int i, j, k;

for(i=0;i<a;i++)

{

var3[1000-a+i] = var3[i];

}

for(i=0;i<1000-a;i++)

{

var3[i] = 0;

}

return 0;

}

int var_plus(int *var1, int *var2, int *var_result)

{

int i;

var_result[1000] = 0;

for(i=0;i<1000;i++)

{

var_result[i] = var1[i]+var2[i];

}

for(i=0;i<1001;i++)

{

if(var_result[i]>9)

{

var_result[i+1] = var_result[i+1]+1;

var_result[i] = var_result[i]-10;

}

}

return 0;

}

int var_minus(int *var1, int *var2, int *var_result)

{

int i, j, k;

for(i=0;i<1000;i++)

{

var_result[i] = var1[i]-var2[i];

}

for(i=0;i<1000;i++)

{

if(var_result[999-i] != 0)

{

j = 999-i;

break;

}

}

if(var_result[j]>0)

{

for(i=0;i<j;i++)

{

if(var_result[i] <0 )

{

var_result[i+1] = var_result[i+1] -1;

var_result[i] = var_result[i] + 10;

}

}

}

if(var_result[j]<0)

{

for(i=0;i<j;i++)

{

if(var_result[i]>0)

{

var_result[i] = 10 - var_result[i];

var_result[i+1] = var_result[i+1]+1;

}

if(var_result[i] <0)

{

var_result[i] = var_result[i] * -1;

}

}

}

return 0;

}

int var_multiple(int *var1, int *var2, int *var_result)

{

int var_temp[2];

int i, j, k;

var_temp[0] = var_temp[1] = 0;

for(i=0;i<2000;i++)

{

var_result[i] = 0;

}

for(i=0;i<1000;i++)

{

for(j=0;j<1000;j++)

{

k = var1[i] * var2[j];

if(k>9)

{

var_temp[0] = k % 10;

var_temp[1] = k - var_temp[0];

var_temp[1] = var_temp[1]/10;

var_result[i+j] = var_result[i+j] + var_temp[0];

var_result[i+j+1] = var_result[i+j+1] + var_temp[1];

}

else

{

var_temp[0] = k;

var_result[i+j] = var_result[i+j] + var_temp[0];

}

}

}

return 0;

}

int var_divide(int *var1, int *var2, int *var3, int *var_result)

{

int i, j, k,m,n;

n=0;

for(i=0;i<2000;i++)

{

var_result[i] = 0;

}

for(;;)

{

for(j=0;j<1000;j++)

{

var3[j] = var1[j]-var2[j];

}

n = n+1;

for(j=0;j<1000;j++)

{

if(var3[999-j] != 0)

{

m=var3[999-j];

break;

}

}

if(m<0)

{

for(j=0;j<1000;j++)

{

var_result[j] = var3[j] + var2[j];

}

var1[0] = n-1;

break;

}

else

{

for(j=0;j<1000;j++)

{

if(var3[j]<0)

{

var3[j+1] = var3[j+1]-1;

var3[j] = var3[j] + 10;

}

var1[j] = var3[j];

}

}

}

return 0;

}


설명

/* 1000 의 자리수의 사칙연산이 가능한 프로그램을 만든다. 단, 연산에 필요한 시간은 1초 이내 */

#include <stdio.h>

int define_var(int *var3, int a);

define_var 는 1000 의 자리수를 맞춰주는 부분이다. 뒤에 몽땅 0 을 때려박는다.

int var_plus(int *var1, int *var2, int *var_result);

int var_minus(int *var1, int *var2, int *var_result);

int var_multiple(int *var1, int *var2, int *var_result);

int var_divide(int *var1, int *var2, int *var3, int *var_result);

int main()

{

int number[10] = {0,1,2,3,4,5,6,7,8,9};

char operation;

int var1[1000], var2[1000], var3[1000];

var1 : 변수 1 var2 : 변수 2 var3 : 계산 중에 쓰일 임시 변수

int *p, *q;

포인터 정의는 따로 없어도 됨. 빼는거 까먹음.

int var_result[2000];

계산 결과를 담을 배열

int a, b, c, d;


printf("숫자를 입력해주십시오. 단, 가장 낮은 자리 숫자부터 입력됩니다. \n 입력을 중단하려면 10 을 입력하십시오. 10 을 입력할 경우 뒤에 0 이 붙습니다. \n");

printf("첫 번째 변수를 입력합니다. \n");

for(a=0;a<1000;a++)

{

scanf("%d", &var1[a]);

var3[a] = var1[a];

if(var1[a] == 10)

{

define_var(var3, a);

for(b=0;b<1000;b++)

{

var1[b] = var3[b];

}

break;

}

}

printf("두 번째 변수를 입력합니다. \n");

for(a=0;a<1000;a++)

{

scanf("%d", &var2[a]);

var3[a] = var2[a];

if(var3[a] == 10)

{

q = &a;

이 부분 필요 없음. q = &a 부분.

define_var(var3, a);

for(b=0;b<1000;b++)

{

var2[b] = var3[b];

}

break;

}

}

printf("수행할 연산은 무엇입니까? 단, 첫 번째 변수가 연산 부호의 왼쪽에 들어갑니다. \n");

scanf(" %c", &operation);

if(operation =='+')

{

var_plus(var1, var2, var_result);

printf("두 수의 합은 다음과 같습니다. \n");

if(var_result[1000] != 0)

{

printf("%d", var_result[1000]);

}

printf("%d", var_result[999]);

for(a=0;a<999;a++)

{

printf("%d", var_result[998-a]);

}

}

else if(operation =='-')

{

var_minus(var1, var2, var_result);

printf("뺄셈의 결과입니다. \n");

for(a=0;a<1000;a++)

{

printf("%d", var_result[999-a]);

}

}

else if(operation =='*')

{

var_multiple(var1, var2, var_result);

printf("곱셈의 결과입니다. \n");

for(a=0;a<2000;a++)

{

if(var_result[1999-a] != 0)

{

b = 1999-a;

break;

}

}

for(a=0;a<b;a++)

{

printf("%d",var_result[b-a]);

}

}

else if(operation =='/')

{

var_divide(var1, var2, var3, var_result);

for(a=0;a<1000;a++)

{

if(var_result[999-a] != 0)

{

b = 999-a;

break;

}

}

printf("몫 : %d \n", var1[0]);

printf("나머지 : ");

for(a=0;a<b;a++)

{

printf("%d", var_result[b-a]);

}

}

return 0;

}

int define_var(int *var3, int a)

{

int i, j, k;

for(i=0;i<a;i++)

{

var3[1000-a+i] = var3[i];

}

for(i=0;i<1000-a;i++)

{

var3[i] = 0;

}

return 0;

}

int var_plus(int *var1, int *var2, int *var_result)

{

int i;

var_result[1000] = 0;

for(i=0;i<1000;i++)

{

var_result[i] = var1[i]+var2[i];

}

for(i=0;i<1001;i++)

{

if(var_result[i]>9)

{

var_result[i+1] = var_result[i+1]+1;

var_result[i] = var_result[i]-10;

}

}

return 0;

}

int var_minus(int *var1, int *var2, int *var_result)

{

int i, j, k;

for(i=0;i<1000;i++)

{

var_result[i] = var1[i]-var2[i];

}

for(i=0;i<1000;i++)

{

if(var_result[999-i] != 0)

{

j = 999-i;

break;

}

}

if(var_result[j]>0)

{

for(i=0;i<j;i++)

{

if(var_result[i] <0 )

{

var_result[i+1] = var_result[i+1] -1;

var_result[i] = var_result[i] + 10;

}

}

}

if(var_result[j]<0)

{

for(i=0;i<j;i++)

{

if(var_result[i]>0)

{

var_result[i] = 10 - var_result[i];

var_result[i+1] = var_result[i+1]+1;

}

if(var_result[i] <0)

{

var_result[i] = var_result[i] * -1;

}

}

}

return 0;

}

int var_multiple(int *var1, int *var2, int *var_result)

{

int var_temp[2];

int i, j, k;

var_temp[0] = var_temp[1] = 0;

for(i=0;i<2000;i++)

{

var_result[i] = 0;

}

for(i=0;i<1000;i++)

{

for(j=0;j<1000;j++)

{

k = var1[i] * var2[j];

if(k>9)

{

var_temp[0] = k % 10;

var_temp[1] = k - var_temp[0];

var_temp[1] = var_temp[1]/10;

var_result[i+j] = var_result[i+j] + var_temp[0];

var_result[i+j+1] = var_result[i+j+1] + var_temp[1];

}

else

{

var_temp[0] = k;

var_result[i+j] = var_result[i+j] + var_temp[0];

}

}

}

return 0;

}

int var_divide(int *var1, int *var2, int *var3, int *var_result)

{

int i, j, k,m,n;

n=0;

for(i=0;i<2000;i++)

{

var_result[i] = 0;

}

for(;;)

{

for(j=0;j<1000;j++)

{

var3[j] = var1[j]-var2[j];

}

n = n+1;

for(j=0;j<1000;j++)

{

if(var3[999-j] != 0)

{

m=var3[999-j];

break;

}

}

if(m<0)

{

for(j=0;j<1000;j++)

{

var_result[j] = var3[j] + var2[j];

}

var1[0] = n-1;

break;

}

else

{

for(j=0;j<1000;j++)

{

if(var3[j]<0)

{

var3[j+1] = var3[j+1]-1;

var3[j] = var3[j] + 10;

}

var1[j] = var3[j];

}

}

}

return 0;

}


연산부분은 특별한 거는 없고 수학적으로 생각해보면 아 그렇구나 싶다.

관련글 더보기

댓글 영역