📄 大数运算3.txt
字号:
/*用数组存储数字,可以超越数据类型的限制,实现极大数的加法,减法和乘法 */
/*2005-3-7 梁见斌*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 80
int a[MAX]={0}, b[MAX]={0};
int *r, *s;
char e[40], f[40];/* e[30]和f[30]存放以字符串形式输入的乘数和被乘数*/
char *p, *q;
void NiZhi(int *ShuZu, int len);/*把数字逆置,把个位数字存储在a[0]*/
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len);/*把字符改存为整型数字*/
int PanDuan(int len);/*当len1=len2时判断a[]和 b[]谁大 */
void JiaFa(int len1, int len2);
void JianFa(int len1, int len2);
void ChengFa(int len1, int len2);
int main(void)
{
int len1, len2;
int choice;
do{
puts("请您选择操作的方式:");
puts("\t加法请按1 ");
puts("\t减法请按2 ");
puts("\t乘法请按3 ");
scanf("%d", &choice);
}while(choice < 1 || choice >3);
r=a;
s=b;
p=e;
q=f;
puts("Inter m:");
scanf("%s", p);
puts("Inter n:");
scanf("%s", q);
len1=strlen(e);
len2=strlen(f);
ZhuanHuan(p, r, len1);
ZhuanHuan(q, s, len2);
NiZhi(r, len1);
NiZhi(s, len2);
switch(choice)
{
case 1: JiaFa(len1, len2);
break;
case 2: JianFa(len1, len2);
break;
case 3: ChengFa(len1, len2);
break;
default: printf("It's error");
}
system("pause");
return 0;
}
void NiZhi(int *ShuZu, int len)
{
int i, t;
for(i=0; i<len/2; i++)
{
t=*(ShuZu+i);
*(ShuZu+i)=*(ShuZu+len-i-1);
*(ShuZu+len-i-1)=t;
}
}
void ZhuanHuan(char *ZhiFu, int *ShuZi, int len)
{
int i;
for(i=0; i<=len-1; i++)
*(ShuZi+i)=int(*(ZhiFu+i))-48;
}
void ChengFa(int len1, int len2)
{
int i, j, k;
int c[MAX]={0}, aa[MAX]={0};/*a[max]和aa[max]存放被乘数,b[max]存放乘数,c[max]存放积*/
int x, jinwei, d;
for(i=0; i<=len2; i++)
{
for(j=0; j<=len1; j++)/*每次都使 aa[ ]表示被乘数*/
aa[j]=a[j];
d=20;/*提供足够多的存储空间以存放积的进位,此处设为20,可根据数据的大小调节*/
jinwei=0;/*c表示积的进位,初值为0*/
for(j=0; j<=len1+d; j++)/*用乘数的每一位从个位开始依次和被乘数相乘,用aa[ ]存储当前积*/
{
x=aa[j]*b[i]+jinwei;
jinwei=x/10;
aa[j]=x%10;
}
while(a[j] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/
j--;
d=4;/*提供足够多的存储空间以存放积的进位,此处设为4,可根据数据的大小调节*/
jinwei=0;/*c表示积的进位,初值为0*/
for(k=0; k<=j+d; k++)/*c[max]存放原始积,注意每次把当前积与原始积时相加时两者的位置对应情况*/
{
x=aa[k]+c[k+i]+jinwei;
jinwei=x/10;
c[k+i]=x%10;
}
}
k=k+i; /*用k表示现有数字的个数,多出的存储空间应消除*/
while(c[k] == 0)
k--;
printf("%s * %s =\n", p, q);
for(i=k; i>=0; i--)
printf("%d",c[i]);
}
void JiaFa(int len1, int len2)
{
int i, j;
int x, jinwei, max;
max=(len1 >= len2)?len1:len2;
jinwei=0;
for(i=0; i<=max+2; i++)
{
x=a[i]+b[i]+jinwei;
jinwei=x/10;
a[i]=x%10;
}
while(a[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/
i--;
printf("%s + %s =\n", p, q);
for(j=i; j>=0; j--)
printf("%d",a[j]);
}
void JianFa(int len1, int len2)
{
int i, j;
int max;
int flag=0;
if(len1 == len2)/*当len1=len2时判断a[]和 b[]谁大 */
flag=PanDuan(len1);
if((len1 > len2) || (len1 == len2) && flag)/*若m大于n直接按m-n计算*/
{
for(i=0; i<len1; i++)
{
if(a[i] >= b[i])
a[i]=a[i]-b[i];
else
{
a[i+1]-=1;
a[i]=a[i]+10-b[i];
}
}
while(a[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/
i--;
printf("%s - %s =\n", p, q);
for(j=i; j>=0; j--)
printf("%d",a[j]);
}
else/*若m小于n,则按n-m计算,输出结果前面加负号*/
{
for(i=0; i<len2; i++)
{
if(b[i] >= a[i])
b[i]=b[i]-a[i];
else
{
b[i+1]-=1;
b[i]=b[i]+10-a[i];
}
}
while(b[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/
i--;
printf("%s - %s =\n", p, q);
printf("-");
for(j=i; j>=0; j--)
printf("%d",b[j]);
}
}
int PanDuan( int len)
{
int i=len;
while(a[i] >= b[i] && i >= 0)
i--;
if(i >= 0)
return 0;
else if((i < 0) && (a[i+1] == b[i+1]))
{
printf("\nThe answer is 0");
system("pause");
exit(0);
}
else
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -