前言:
大数运算一
大数的运算,说大数,那就不能用简单的数据类型能解决的。我想到的是用数组存储数据。
大概思路:说先义字符的形式把数输入到数组中。然后对这些数进行操作。
加法:从最低位开始,将每以为相对的进行相减,如果见不过还要向前面借位。
这里的代码也考虑到了小数的问题
#include<stdio.h>
#include<string.h>
void add(char a[1000], char b[1000])
{
char s1[1000], s2[1000];
int i, j, len1, len2, n, m, k=0, l=0, max, maxx;
for (i = 0; i < 1000; i++)
{
s1[i] = '0';
s2[i] = '0';
}
len1 = strlen(a);
len2 = strlen(b);
//确认与定位小数点
for (i = 0; i < len1; i++)
{
if (a[i] == '.')
{
n = i;
for (j = i+1; j < len1; j++)
{
k++;
}
break;
}
}
for (i = 0; i < len2; i++)
{
if (b[i] == '.')
{
m = i;
for (j = i + 1; j < len2; j++)
{
l++;
}
break;
}
}
max = k > l ? k : l;
//将两个大数的小数点后的位数整理为相等,不足补零
if (k == 0 && l > 0)
{
a[len1] = '.';
for (j = len1+1; j <= len1+max; j++)
{
a[j] = '0';
}
a[len1+max+1]='\0';
}
if (l == 0 && k > 0)
{
b[len2] = '.';
for (j = len2 + 1; j < max+len2; j++)
{
b[j] = '0';
}
b[len2+max+1]='\0';
}
if (l > 0 && k > 0)
{
for (i = len1; i <= n + max;i++)
{
a[i] = '0';
}
for (i = len2; i <= m + max; i++)
{
b[i] = '0';
}
a[n+max+1]='\0';
b[m+max+1]='\0';
}
len1 = strlen(a);
len2 = strlen(b);
maxx = len1 > len2 ? len1 : len2;
//复制大数,将两个大数的末位放s1,s2数组的首位
for (i = len1 - 1, j = 0; i >= 0; i--)
{
s1[j] = a[i];
j++;
}
for (i = len2 - 1, j = 0; i >= 0; i--)
{
s2[j] = b[i];
j++;
}
//两大数相加
for (i = 0; i < maxx; i++)
{
if (s1[i] != '.')
{
s1[i] = s1[i] + s2[i]-'0';
if (s1[i + 1] == '.')
{
if (s1[i] > 57)
{
s1[i] = s1[i] - 10;
s1[i + 2]++;
}
}
else
{
if (s1[i] > 57)
{
s1[i] = s1[i] - 10;
s1[i + 1]++;
}
}
}
}
if (s1[maxx] == '0')
{
for (i = maxx - 1; i >= 0; i--)
{
printf("%c", s1[i]);
}
}
else
{
for (i = maxx; i >= 0; i--)
{
printf("%c", s1[i]);
}
}
printf("\n");
}
int main()
{
char a[1000], b[1000];
gets(a);
gets(b);
add(a, b);
return 0;
}