#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 이 값이 최대 연산 가능한 자리수이다.
이 값을 늘리면 더 많은 자리수도 연산가능해진다.
하지만 system memory가 허락하는 범위 안에서 가능하다. */
#define MAX_BUFF_SIZE 5000000
void deohagi(char *, char *, char *);
void bbegi(char *, char *, char *);
void gobhagi(char *, char *, char *);
void nanugi(char *, char *, char *);
void fac(char *, char *);
void outfile(char *, char *, char *, char);
main()
{
char *a;
char *b;
char c;
char *result;
int i;
a = (char *)malloc(MAX_BUFF_SIZE);
b = (char *)malloc(MAX_BUFF_SIZE);
result = (char *)malloc(MAX_BUFF_SIZE);
cont:
for(i=0;i<MAX_BUFF_SIZE;i++){
a[i] = b[i] = result[i] = '\0';
}
printf("input number a->");
gets(a);
if(strlen(a) > MAX_BUFF_SIZE){
printf("input error 첨부터 다시..\n");
goto cont;
}
printf("연산방식 입력( + - * / ! )-> ");
gets(result);
c = result[0];
strcpy(result, "0");
if(c != '+' && c != '-' && c != '*' && c != '/' && c != '!'){
printf("input error 첨부터 다시..\n");
goto cont;
}
if(c != '!'){
printf("input number b->");
gets(b);
if(strlen(b) > MAX_BUFF_SIZE){
printf("input error 첨부터 다시..\n");
goto cont;
}
}
// printf("값을 입력해라.. ex)1000 + 1000) 연산은 + - * / !\n");
// scanf("%s %c %s", a, &c, b);
// getchar(); // 마지막 엔터 읽어서 없에기..
if(c != '+' && c != '-' && c != '*' && c != '/' && c != '!'){
printf("input error 연산자, 첨부터 다시..\n");
goto cont;
}
if(strlen(a) > MAX_BUFF_SIZE){
printf("input error A수 , 첨부터 다시..\n");
goto cont;
}
if(strlen(b) > MAX_BUFF_SIZE){
printf("input error 뒷수, 첨부터 다시..\n");
goto cont;
}
if(c == '+'){
deohagi(a, b, result);
printf("'%s'\n",result);
// outfile(a, b, result, c);
}else if(c == '-'){
bbegi(a, b, result);
printf("'%s'\n",result);
// outfile(a, b, result, c);
}else if(c == '*'){
gobhagi(a, b, result);
printf("'%s'\n",result);
// outfile(a, b, result, c);
}else if(c == '/'){
nanugi(a, b, result);
printf("'%s'\n",result);
// outfile(a, b, result, c);
}else if(c == '!'){
fac(a, result);
printf("'%s'\n",result);
outfile(a, "", result, c);
}
KIN:
printf(" \n");
exit(0);
gets(result);
c = result[0];
if(c == '2'){
exit(0);
}else if(c == '1'){
goto cont;
}else{
printf("똑바로 입력해라\n");
goto KIN;
}
}
// 0: 48, 9:57
void deohagi(char *a, char *b, char *result)
{
int i;
int lenA, lenB, lenC;
int smallRst, smallPa;
char *temp;
temp = (char *)malloc(MAX_BUFF_SIZE);
smallRst = smallPa = 0;
lenA = strlen(a)-1;
lenB = strlen(b)-1;
lenC = 0;
for(i=0;i<MAX_BUFF_SIZE;i++, lenA--, lenB--){
if(lenA > -1 && lenB > -1){
smallRst = (a[lenA] - 48) + (b[lenB] - 48) + smallPa;
smallPa = smallRst>=10 ? 1 : 0 ;
smallRst = smallRst % 10;
temp[i] = smallRst + 48;
}else{
if(lenA > -1){
smallRst = (a[lenA] - 48) + smallPa;
smallPa = smallRst>=10 ? 1 : 0 ;
smallRst = smallRst % 10;
temp[i] = smallRst + 48;
}else if(lenB > -1){
smallRst = (b[lenB] - 48) + smallPa;
smallPa = smallRst>=10 ? 1 : 0 ;
smallRst = smallRst % 10;
temp[i] = smallRst + 48;
}else{
temp[i] = smallPa + 48;
temp[i+1] = '\0';
break;
}
}// if(lenA > -1 && lenB > -1){
}
if(smallPa)
i++;
for(lenC=0;i>=0;i--,lenC++){
result[lenC-1] = temp[i];
}
result[lenC] = '\0';
free(temp);
}
void gobhagi(char *a, char *b, char *result)
{
int i,j;
int lenB;
char *aa;
char *bb;
aa = (char *)malloc(MAX_BUFF_SIZE);
bb = (char *)malloc(MAX_BUFF_SIZE);
strcpy(aa, "0");
strcpy(bb, a);
lenB = strlen(b) -1;
for(i=0;lenB > -1;i++, lenB--){
j = b[lenB] - 48;
for(;j>0;j--){ /* */
deohagi(aa, bb, result);
strcpy(aa, result);
}
strcat(bb,"0");
}
free(aa);
free(bb);
}
void bbegi(char *a, char *b, char *result)
{
int i;
int lenA, lenB, lenC;
int smallRst, smallPa;
int isMinus=0;
char *temp, *aa, *bb;
char *p, *q;
temp = (char *)malloc(MAX_BUFF_SIZE);
aa = (char *)malloc(MAX_BUFF_SIZE);
bb = (char *)malloc(MAX_BUFF_SIZE);
smallRst = smallPa = 0;
lenA = strlen(a)-1;
lenB = strlen(b)-1;
lenC = 0;
strcpy(aa, a);
strcpy(bb, b);
if(lenA < lenB){
isMinus = 1;
}else if(lenA == lenB){
if(a[0] < b[0]){
isMinus = 1;
}
}
min:
if(isMinus){
strcpy(temp, aa);
strcpy(aa, bb);
strcpy(bb, temp);
lenA = strlen(aa)-1;
lenB = strlen(bb)-1;
}
for(i=0;i<MAX_BUFF_SIZE;i++, lenA--, lenB--){
if(lenA > -1 && lenB > -1){
smallRst = (aa[lenA] - 48) - (bb[lenB] - 48) - smallPa;
smallPa = 0;
if(smallRst < 0){
smallRst += 10;
smallPa = 1;
}
temp[i] = smallRst + 48;
}else{
if(lenA > -1){
smallRst = (aa[lenA] - 48) - smallPa;
smallPa = 0;
if(smallRst < 0){
smallRst += 10;
smallPa = 1;
}
smallRst = smallRst % 10;
temp[i] = smallRst + 48;
}else if(lenB > -1){
smallRst = (bb[lenB] - 48) - smallPa;
smallPa = 0;
if(smallRst < 0){
smallRst += 10;
smallPa = 1;
}
smallRst = smallRst % 10;
temp[i] = smallRst + 48;
}else{
if(smallPa){
smallPa = 0;
isMinus = 1;
goto min;
}
// temp[i] = smallPa + 48 ;
temp[i] = '\0';
break;
}
}// if(lenA > -1 && lenB > -1){
}
lenC=0;
if(isMinus){
result[0] = '-';
lenC += 2;
i--;
}
for(;i>=0;i--){
result[lenC-1] = temp[i];
lenC++;
}
result[lenC] = '\0';
q = p = result;
while(*p){
if(*p == '-'){
p++;
q++;
}else if(*p == '0'){
p++;
}else{
strcpy(q, p);
break;
}
}
free(temp);
free(aa);
free(bb);
}
int nanugiLoop = 0;
void nanugi(char *a, char *b, char *result)
{
char *aa, *bb, *cc, *temp, *temp1;
aa = (char *)malloc(MAX_BUFF_SIZE);
bb = (char *)malloc(MAX_BUFF_SIZE);
cc = (char *)malloc(MAX_BUFF_SIZE);
temp = (char *)malloc(MAX_BUFF_SIZE);
temp1 = (char *)malloc(MAX_BUFF_SIZE);
strcpy(aa, a);
strcpy(bb, b);
strcpy(cc, "0");
while(1){
memset(temp1, 0, MAX_BUFF_SIZE);
memset(temp, 0, MAX_BUFF_SIZE);
bbegi(aa, bb, temp);
if(temp[0] != '-' ){
if(temp[0] == '0'){
deohagi(cc, "1", temp1);
break;
}
strcpy(aa, temp);
deohagi(cc, "1", temp1);
strcpy(cc, temp1);
}else{
break;
}
}
strcpy(result, temp[0] != '-' ? temp1 : cc);
if(temp1[0] != '0' || temp1[0] != '-'){
char *aaa;
char *bbb;
char *ccc;
aaa = (char *)malloc(MAX_BUFF_SIZE);
bbb = (char *)malloc(MAX_BUFF_SIZE);
ccc = (char *)malloc(MAX_BUFF_SIZE);
if(nanugiLoop++ < 30){
strcpy(aaa, temp[0] == '-' ? aa : temp);
strcpy(bbb, "10");
gobhagi(aaa, bbb, ccc);
// printf("%2d : %s * %s = %s\n",nanugiLoop ,aaa,bbb,ccc);
nanugi(ccc, b, bbb);
// printf("%2d : %s / %s = %s\n",nanugiLoop ,ccc,b,bbb);
} /* if(nanugiLoop < 30){ */
if(strcmp(bbb,"0") == 0) strcpy(bbb,"");
if(nanugiLoop-- > 1){
strcat(result, bbb);
}else{
strcat(result, ".");
strcat(result, bbb);
} /* if(nanugiLoop-- > 0){ */
// strcat(result, " 나머지 ");
// strcat(result, temp[0] == '-' ? aa : temp);
free(aaa);
free(bbb);
free(ccc);
}
free(temp);
free(temp1);
free(aa);
free(bb);
free(cc);
}
void fac(char *a, char *result)
{
char *aa;
char *bb;
char *rst;
aa = (char *)malloc(MAX_BUFF_SIZE);
bb = (char *)malloc(MAX_BUFF_SIZE);
rst = (char *)malloc(MAX_BUFF_SIZE);
strcpy(aa, a);
strcpy(rst, a);
do{
bbegi(aa, "1", bb);
strcpy(aa,bb);
printf("now -> %s\n", bb);
gobhagi(rst, bb, result);
strcpy(rst, result);
}while(strcmp(bb, "2"));
free(aa);
free(bb);
free(rst);
}
void outfile(char *a, char *b, char *c, char d)
{
FILE *fp;
fp = fopen("infile.txt", "w");
fprintf(fp,"%s %c %s", a, d, b);
fclose(fp);
fp = fopen("outfile.txt", "w");
fprintf(fp,"%s", c);
fclose(fp);
}
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.