无小数无负数的大数加减
没仔细测过,不确定是不是完全正确
思路
加减操作都类似,把输入的字符串转化为整型的数组。然后把两个数组都倒过来。每一位分别相加减,然后处理进位和借位问题。得到的和差再倒过来输出。里面有些小坑必须自己动手去写代码才能感受到。
#include<stdio.h>
#include<string.h>
char s[100];
int num1[100] = { 0 }, num2[100] = { 0 }, sum[100] = { 0 }, dif[100] = { 0 };
void NumToArr(char *s, int* num);
void ReverseArr(char *s, int* num);
void Add(int* num1, int* num2);
void OutputTotal(int* sum);
int Cmp(int* num1, int* num2);
void Sub(int* num1, int* num2);
int main()
{
scanf("%s", s);
NumToArr(s, num1);
ReverseArr(s,num1);
scanf("%s", s);
NumToArr(s, num2);
ReverseArr(s,num2);
Add(num1, num2);
OutputTotal(sum);
if (Cmp(num1, num2) == 1)
{
Sub(num1, num2);
OutputTotal(dif);
}
else
{
Sub(num2, num1);
//输出一个负号
printf("-");
OutputTotal(dif);
}
return 0;
}
//将字符数组转化为整型数组
void NumToArr(char *s, int* num)
{
int k = 0;
while (*(s) != '\0')
{
num[k++] = *s - '0';
s++;
}
}
//将数组倒序存放
void ReverseArr(char *s, int* num)
{
int length = strlen(s);
int temp = 0;
for (int i = 0; i < length/2; i++)
{
temp = num[i];
num[i] = num[length - 1 - i];
num[length - 1 - i] = temp;
}
}
void Add(int* num1, int* num2)
{
printf("相加:");
for (int i = 0; i < 100; i++)
{
sum[i] += num1[i] + num2[i];
if (num1[i] + num2[i] >= 10)
{
sum[i + 1] += sum[i] / 10;
sum[i] = sum[i] % 10;
}
}
}
//输出,注意只能从后往前找最高为
void OutputTotal(int* sum)
{
int i = 99;
while (i > 0 && sum[i] == 0)
i--;
for (int j = i; j >= 0; j--)
{
printf("%d", sum[j]);
}
printf("\n");
}
//从最高位开始比较大小
int Cmp(int* num1, int* num2)
{
for (int i = 99; i >= 0; i--)
{
if (num1[i] != 0 || num2[i] != 0)
{
if (num1[i] > num2[i])
return 1;
else
return -1;
}
}
}
void Sub(int* num1, int* num2)
{
printf("相减:");
for (int i = 0; i < 100; i++)
{
dif[i] += num1[i] - num2[i];
if (dif[i] < 0)
{
dif[i + 1]--;
dif[i] = dif[i] + 10;
}
}
}