Бывает...
Не обращайте внимания. У меня флешка вунивере не читается, приходится так пересылать = )
читать дальше/*(c) Колбас Касыр, 2008*/
#include stdio.h
#include stdlib.h
#define NMAX 100
#define ENTER '\n'
#define PLUS '+'
#define MINUS '-'
#define MULT '*'
#define EXIT 'exit'
struct big_num
{
int ln;
char *n;
};
int f,g;
typedef struct big_num big_num;
char *get_mem(int ln)
{
char *n;
n = (char *)malloc(sizeof(char) * ln);
// printf("malloc: %ld, %d\n", (long)n, ln);
g++;
return n;
}
void free_mem(char *n)
{
f++;
// printf("free: %ld\n", (long)n);
free(n);
}
/* get big number */
int big_read(big_num num)
{
char n;
num.ln = 0;
while ((n = getchar()) != ENTER)
{
if ((n >= '0') && (n <= '9'))
{
num.n[num.ln] = n - '0';
num.ln++;
}
else
printf("error\n");
}
return num.ln;
}
/* nice vision (gg321 = 00123) */
void big_mod(big_num num, int ml)
{
int i;
int a;
int j;
i = num.ln - 1;
for (j = 0; j <= i; j++)
{
a = num.n[j];
num.n[j] = num.n[i];
num.n[i] = a;
i--;
}
for (j = ml + 1; j >= num.ln; j--)
num.n[j] = 0;
}
/* addition */
big_num big_add(big_num num1, big_num num2)
{
big_num num;
int maxi;
int i;
num.ln = 0;
if (num1.ln >= num2.ln)
maxi = num1.ln;
else
maxi = num2.ln;
num.n = get_mem(maxi + 1);
big_mod(num, num.ln);
for (i = 0; i < maxi; i++)
{
if ((num1.n[i] + num2.n[i] + num.n[i]) / 10 == 1)
{
num.n[i] += (num1.n[i] + num2.n[i]) - 10;
num.n[i + 1] = 1;
}
else
num.n[i] += num1.n[i] + num2.n[i];
}
num.ln = maxi + 1;
while (num.n[num.ln] == 0)
num.ln--;
if (num.ln < 0)
num.ln = 0;
return num;
}
/* substruction */
big_num big_sub(big_num num1, big_num num2)
{
big_num num;
int maxi;
int i, j;
int sgn;
if (num1.ln > num2.ln)
{
maxi = num1.ln;
sgn = 1;
}
else
if (num1.ln < num2.ln)
{
maxi = num2.ln;
sgn = -1;
}
else
{
maxi = num1.ln;
i = maxi - 1;
while (num1.n[i] == num2.n[i])
i--;
if (num1.n[i] > num2.n[i])
sgn = 1;
else
sgn = -1;
}
num.n = get_mem(maxi);
num.ln = 0;
big_mod(num, num.ln);
for (i = 0; i < maxi; i++)
{
if (sgn * (num1.n[i] - num2.n[i]) < 0)
{
num.n[i] = sgn * (num1.n[i] - num2.n[i]) + 10;
if (sgn == 1)
num1.n[i + 1]--;
else
num2.n[i + 1]--;
}
else
num.n[i] = sgn * (num1.n[i] - num2.n[i]);
}
num.ln = maxi;
while (num.n[num.ln] == 0)
num.ln--;
num.n[num.ln] *= sgn;
if (num.ln < 0)
num.ln = 0;
return num;
}
/* multiplication */
big_num big_mul(big_num num1, big_num num2)
{
big_num num;
int i, j;
int maxi;
num.ln = 0;
if (num1.ln >= num2.ln)
maxi = num1.ln;
else
maxi = num2.ln;
num.n = get_mem(2 * maxi);
big_mod(num, num.ln);
for (j = 0; j < maxi; j++)
for (i = 0; i < maxi; i++)
{
if ((num1.n[i] * num2.n[j] + num.n[i + j]) / 10 >= 1)
{
num.n[i + 1] = (num1.n[i] * num2.n[j] + num.n[i + j]) / 10;
num.n[i + j] += (num1.n[i] * num2.n[j]) % 10;
}
else
num.n[i + j] += num1.n[i] * num2.n[j];
if (num.n[i +j] > 9)
{
num.n[i + j + 1] = num.n[i + j] / 10;
num.n[i +j] %= 10;
}
}
/* for (j = 0; i < num1.ln; i++)
for (i = 0; j < num2.ln; j++)
*/
num.ln = 2 * maxi + 1;
while (num.n[num.ln] == 0)
num.ln--;
if (num.ln < 0)
num.ln = 0;
return num;
}
int main() //------------------------------------------------
{
int j;
int in;
big_num num1, num2, res;
num1.n = get_mem(NMAX);
num2.n = get_mem(NMAX);
num1.ln = big_read(num1);
num2.ln = big_read(num2);
big_mod(num1, num1.ln);
big_mod(num2, num2.ln);
switch (in = getchar())
{
case PLUS:
res = big_add(num1, num2);
break;
case MINUS:
res = big_sub(num1, num2);
break;
case MULT:
res = big_mul(num1, num2);
break;
default:
printf("GON\n");
break;
}
/*
for (j = NMAX-1; j >= 0; j--)
printf("%d ", num2.n[j])i;
ii
printf("\n%d %d\n", num1.ln, num2.ln);
printf("\n");
*/
for (j = res.ln; j >= 0; j--)
printf("%d ", res.n[j]);
free_mem(res.n);
free_mem(num1.n);
free_mem(num2.n);
// printf("\n%d %d\n", g, f);
printf("\n");
return 0;
}
читать дальше/*(c) Колбас Касыр, 2008*/
#include stdio.h
#include stdlib.h
#define NMAX 100
#define ENTER '\n'
#define PLUS '+'
#define MINUS '-'
#define MULT '*'
#define EXIT 'exit'
struct big_num
{
int ln;
char *n;
};
int f,g;
typedef struct big_num big_num;
char *get_mem(int ln)
{
char *n;
n = (char *)malloc(sizeof(char) * ln);
// printf("malloc: %ld, %d\n", (long)n, ln);
g++;
return n;
}
void free_mem(char *n)
{
f++;
// printf("free: %ld\n", (long)n);
free(n);
}
/* get big number */
int big_read(big_num num)
{
char n;
num.ln = 0;
while ((n = getchar()) != ENTER)
{
if ((n >= '0') && (n <= '9'))
{
num.n[num.ln] = n - '0';
num.ln++;
}
else
printf("error\n");
}
return num.ln;
}
/* nice vision (gg321 = 00123) */
void big_mod(big_num num, int ml)
{
int i;
int a;
int j;
i = num.ln - 1;
for (j = 0; j <= i; j++)
{
a = num.n[j];
num.n[j] = num.n[i];
num.n[i] = a;
i--;
}
for (j = ml + 1; j >= num.ln; j--)
num.n[j] = 0;
}
/* addition */
big_num big_add(big_num num1, big_num num2)
{
big_num num;
int maxi;
int i;
num.ln = 0;
if (num1.ln >= num2.ln)
maxi = num1.ln;
else
maxi = num2.ln;
num.n = get_mem(maxi + 1);
big_mod(num, num.ln);
for (i = 0; i < maxi; i++)
{
if ((num1.n[i] + num2.n[i] + num.n[i]) / 10 == 1)
{
num.n[i] += (num1.n[i] + num2.n[i]) - 10;
num.n[i + 1] = 1;
}
else
num.n[i] += num1.n[i] + num2.n[i];
}
num.ln = maxi + 1;
while (num.n[num.ln] == 0)
num.ln--;
if (num.ln < 0)
num.ln = 0;
return num;
}
/* substruction */
big_num big_sub(big_num num1, big_num num2)
{
big_num num;
int maxi;
int i, j;
int sgn;
if (num1.ln > num2.ln)
{
maxi = num1.ln;
sgn = 1;
}
else
if (num1.ln < num2.ln)
{
maxi = num2.ln;
sgn = -1;
}
else
{
maxi = num1.ln;
i = maxi - 1;
while (num1.n[i] == num2.n[i])
i--;
if (num1.n[i] > num2.n[i])
sgn = 1;
else
sgn = -1;
}
num.n = get_mem(maxi);
num.ln = 0;
big_mod(num, num.ln);
for (i = 0; i < maxi; i++)
{
if (sgn * (num1.n[i] - num2.n[i]) < 0)
{
num.n[i] = sgn * (num1.n[i] - num2.n[i]) + 10;
if (sgn == 1)
num1.n[i + 1]--;
else
num2.n[i + 1]--;
}
else
num.n[i] = sgn * (num1.n[i] - num2.n[i]);
}
num.ln = maxi;
while (num.n[num.ln] == 0)
num.ln--;
num.n[num.ln] *= sgn;
if (num.ln < 0)
num.ln = 0;
return num;
}
/* multiplication */
big_num big_mul(big_num num1, big_num num2)
{
big_num num;
int i, j;
int maxi;
num.ln = 0;
if (num1.ln >= num2.ln)
maxi = num1.ln;
else
maxi = num2.ln;
num.n = get_mem(2 * maxi);
big_mod(num, num.ln);
for (j = 0; j < maxi; j++)
for (i = 0; i < maxi; i++)
{
if ((num1.n[i] * num2.n[j] + num.n[i + j]) / 10 >= 1)
{
num.n[i + 1] = (num1.n[i] * num2.n[j] + num.n[i + j]) / 10;
num.n[i + j] += (num1.n[i] * num2.n[j]) % 10;
}
else
num.n[i + j] += num1.n[i] * num2.n[j];
if (num.n[i +j] > 9)
{
num.n[i + j + 1] = num.n[i + j] / 10;
num.n[i +j] %= 10;
}
}
/* for (j = 0; i < num1.ln; i++)
for (i = 0; j < num2.ln; j++)
*/
num.ln = 2 * maxi + 1;
while (num.n[num.ln] == 0)
num.ln--;
if (num.ln < 0)
num.ln = 0;
return num;
}
int main() //------------------------------------------------
{
int j;
int in;
big_num num1, num2, res;
num1.n = get_mem(NMAX);
num2.n = get_mem(NMAX);
num1.ln = big_read(num1);
num2.ln = big_read(num2);
big_mod(num1, num1.ln);
big_mod(num2, num2.ln);
switch (in = getchar())
{
case PLUS:
res = big_add(num1, num2);
break;
case MINUS:
res = big_sub(num1, num2);
break;
case MULT:
res = big_mul(num1, num2);
break;
default:
printf("GON\n");
break;
}
/*
for (j = NMAX-1; j >= 0; j--)
printf("%d ", num2.n[j])i;
ii
printf("\n%d %d\n", num1.ln, num2.ln);
printf("\n");
*/
for (j = res.ln; j >= 0; j--)
printf("%d ", res.n[j]);
free_mem(res.n);
free_mem(num1.n);
free_mem(num2.n);
// printf("\n%d %d\n", g, f);
printf("\n");
return 0;
}
пс: работает?
Правда сделать надо еще стока же))
Аа, жесть! Там где написано "инклюд", тм в угловых скобках "<" должнобыть имя библиотеки, а днвник ее а скрипт принимает и не печатает )
не кусайся, а гуманитарий