문제는 이렇다.
--> 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;
}
연산부분은 특별한 거는 없고 수학적으로 생각해보면 아 그렇구나 싶다.
C 언어 예제, 문자열 대소문자 전환하기 (0) | 2014.02.09 |
---|---|
C 언어 예제, 문자열 뒤집기, 문자열 역순 출력 (0) | 2014.02.09 |
C 언어 예제, 에라토스테네스의 체를 이용하여 소수 찾기 (0) | 2014.01.06 |
C 언어 예제, 계산기 만들기 (0) | 2013.12.27 |
C 언어 예제, 유클리드 호제법으로 최대공약수 구하기(포인터 이용) (0) | 2013.12.24 |
댓글 영역