长整数计算 大整数一般指超过十位的十进制整数,这里假定不超过五十位。这类大整数在C语言系统中因超界溢出,因而不能直接表达和计算。 本题目中建议以字符串形式输入、存放和输出大整数,计算时可以将字符串中的每位数字字符转换成相应数值进行运算,结果再转回字符存放和输出。 功能要求: 主函数输入2个大整数,并提供功能菜单供用户选择,用户可以选择调用以下各个运算功能,对这两个大整数进行相应的计算,并输出结果。也可以选择继续或退出程序。系统应提供以下功能: (1) 加法:对主函数输入的大整数进行加法运算,并输出结果; (2) 减法:对主函数输入的大整数进行加法运算,并输出结果; (3) 乘法:对主函数输入的大整数进行乘法运算,并输出结果;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
int max_s(int a, int b)
{
if (a > b)return a;
else return b;
}
void add(char* str1, char* str2)
{
int a[50],b[50],c[50];
printf("%s + %s = ", str1, str2);
int i, carry = 0;
int len1 = strlen(str1), len2 = strlen(str2), len = max_s(len1, len2);
for (i = 0;i < len1;i++)
a[i] = str1[len1 - 1 - i] - '0';
for (i = 0;i < len2;i++)
b[i] = str2[len2 - 1 - i] - '0';
for (i = 0;i < len;i++)
{
c[i] = (a[i] + b[i] + carry) % 10;
carry = (a[i] + b[i] + carry) / 10;
}
if (carry != 0)
c[len++] = 1;
for (i = len - 1;i >= 0;i--)
printf("%d", c[i]);
printf("\n");
}
void sub(char* str1, char* str2)
{
int a[50], b[50], c[50];
printf("%s - %s = ", str1, str2);
int i, borrow = 0;
int len1 = strlen(str1), len2 = strlen(str2), len = max_s(len1, len2);
for (i = 0;i < len1;i++)
a[i] = str1[len1 - 1 - i] - '0';
for (i = 0;i < len2;i++)
b[i] = str2[len2 - 1 - i] - '0';
if (len2 > len1)
{
printf("-");
for (i = 0;i < len;i++)
{
c[i] = b[i] - a[i] - borrow;
if (c[i] < 0)
{
borrow = 1;
c[i] += 10;
}
else
borrow = 0;
}
}
else
{
for (i = 0;i < len;i++)
{
c[i] = a[i] - b[i] - borrow;
if (c[i] < 0 && i + 1 < len)
{
borrow = 1;
c[i] += 10;
}
else
borrow = 0;
}
}
if (c[len - 1] < 0)
{
printf("-");
for (i = 0;i < len;i++)
{
c[i] = b[i] - a[i] - borrow;
if (c[i] < 0 && i + 1 < len)
{
borrow = 1;
c[i] += 10;
}
else
borrow = 0;
}
}
while (c[len - 1] == 0 && len > 1)
len--;
for (i = len - 1;i >= 0;i--)
printf("%d", c[i]);
printf("\n");
}
void mul(char* str1, char* str2)
{
int a[50], b[50], c[50];
printf("%s * %s = ", str1, str2);
int i, j, k, carry = 0, tmp;
int len1 = strlen(str1), len2 = strlen(str2);
for (i = 0;i < len1;i++)
a[i] = str1[len1 - 1 - i] - '0';
for (i = 0;i < len2;i++)
b[i] = str2[len2 - 1 - i] - '0';
for (i = 0;i < len1;i++)
{
for (k = i, j = 0;j < len2;j++, k++)
{
c[k] += a[i] * b[j];
}
}
for (i = 0;i <= k;i++)
{
c[i] += carry;
tmp = c[i];
c[i] = tmp % 10;
carry = tmp / 10;
}
for (i = k;c[i] == 0;i--);
for (;i >= 0;i--)
printf("%d", c[i]);
printf("\n");
}
void menu1()
{
printf("\n\n");
printf("\t\t\t\t1.进入运算\n\n");
printf("\t\t\t\t0.exit\n\n");
}
void menu2()
{
printf("\n\n");
printf("\t\t\t\t1.两数相加(+)\n\n");
printf("\t\t\t\t2.两数相减(-)\n\n");
printf("\t\t\t\t3.两数相乘(*)\n\n");
}
int main()
{
int n;
char a[50] = { 0 };
char b[50] = { 0 };
int flag = 1;
menu1();
scanf("%d", &flag);
while (flag)
{
system("cls");
printf("\t\t\t输入第一个数字:");
printf("\n\n");
scanf(" %s",&a);
printf("\t\t\t输入第二个数字:");
printf("\n\n");
scanf(" %s",&b);
menu2();
scanf("%d",&n);
switch(n)
{
case 1:add(a,b);break;
case 2:sub(a,b);break;
case 3:mul(a,b);break;
default:
printf("请重新输入");
}
menu1();
scanf("%d", &flag);
}
return 0;
}
以后看着修改
|