📄 高精度整数运算.c
字号:
#include <stdio.h>
#include <string.h>
int neg[3] = {0, 0, 0};
char ot[101] = "0";
void print(char*);
char* add(char*, char*);
char* minus(char*, char*);
char* multiply(char*, char*);
int format(char*, char*);
main()
{
char m[101] = "", n[101] = "", temp[51];
char op;
char *out;
int i, j = 0;
gets(temp);
if(temp[0] == '-')
neg[0] = 1;
for(i = strlen(temp) - 1; i >= neg[0]; i--, j++)
m[j] = temp[i];
gets(&op);
j = 0;
gets(temp);
if(temp[0] == '-')
neg[1] = 1;
for(i = strlen(temp) - 1; i >= neg[1]; i--, j++)
n[j] = temp[i];
switch(op)
{
case '+':
out = add(m, n);
break;
case '-':
out = minus(m, n);
break;
case '*':
out = multiply(m, n);
break;
}
print(out);
}
int format(char* m, char* n)
{
char temp[100];
int tmp;
int x = strlen(m);
if(strlen(m) == strlen(n))
{
while(m[x] == n[x])
x--;
}
if(x == -1) return 0;
if((strlen(m) < strlen(n)) || (strlen(m) == strlen(n) && m[x] < n[x]))
{
strcpy(temp, m);
strcpy(m, n);
strcpy(n, temp);
tmp = neg[0];
neg[0] = neg[1];
neg[1] = tmp;
return 1;
}
return 0;
}
void print(char* out)
{
int i;
int st = 0;
for(i = 0; i < strlen(out); i++)
{
if(out[i] != '0')
break;
}
if(i >= strlen(out))
{
printf("0\n");
return;
}
if(neg[3])
printf("-");
for(i = strlen(out) - 1; i >= 0; i--)
{
if(out[i] != '0')
st = 1;
if(st)
printf("%c", out[i]);
}
printf("\n");
}
char* add(char* m, char* n)
{
int jwf = 0, i;
format(m, n);
if(neg[0])
neg[3] = 1;
if(neg[0] && !neg[1])
{
neg[0] = 0;
return minus(n, m);
}
else if(!neg[0] && neg[1])
{
neg[1] = 0;
return minus(m, n);
}
else
{
for(i = 0; i < strlen(n); i++)
{
m[i] += (n[i] - '0' + jwf);
if(m[i] > '9')
{
jwf = 1;
m[i] = '0' + m[i] - ('9' + 1);
}
else
jwf = 0;
}
while(jwf)
{
if(i == strlen(m))
{
m[i] = '1';
break;
}
m[i]++;
if(m[i] > '9')
{
jwf = 1;
m[i] = '0';
}
else
jwf = 0;
i++;
}
}
return m;
}
char* minus(char* m, char* n)
{
int f, jwf = 0, i;
if(neg[0] && !neg[1])
{
neg[1] = 1;
return add(m, n);
}
if(!neg[0] && neg[1])
{
neg[1] = 0;
return add(m, n);
}
f = format(m, n);
if(neg[0] && neg[1])
neg[3] = 1;
if(f)
neg[3] = ((neg[3] == 1) ? 0 : 1);
for(i = 0; i < strlen(n); i++)
{
m[i] -= (n[i] - '0' + jwf);
if(m[i] < '0')
{
jwf = 1;
m[i] = '9' + 1 - ('0' - m[i]);
}
else
jwf = 0;
}
while(jwf)
{
m[i]--;
if(m[i] < '0')
{
jwf = 1;
m[i] = '9';
}
else
jwf = 0;
i++;
}
return m;
}
char* multiply(char* m, char* n)
{
int i, j, k;
char temp[101] = "", p[101];
char c[2] = {'0', '\0'} ;
format(m, n);
strcpy(p, m);
if((neg[0] && !neg[1]) || (!neg[0] && neg[1]))
neg[3] = 1;
neg[0] = neg[1] = 0;
for(i = 0; i < strlen(n); i++)
{
for(j = 0; j < n[i] - '0'; j++)
{
for(k = 0; k < i; k++)
strcat(temp, c);
strcat(temp, p);
strcpy(m, temp);
strcpy(ot, add(m, ot));
temp[0] = '\0';
}
}
return ot;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -