大数四则运算(C语言)
2007-04-17 22:27
330 查看
完全按照自己的想法做的,所以不太成熟,希望有兴趣的朋友提出意见!
#include<stdio.h>
#include<string.h>
//最大数长度
#define MAX 200
//读入输入的大整数,a[0]存储大整数的长度
void read(int *a)
{
unsigned int i,len;
char s[MAX];
scanf("%s",&s);
a[0] = strlen(s);
for(i=0; i<a[0]; i++)
{
if(s[i]>='0' && s[i]<='9')
a[a[0]-i] = s[i]-'0';
else
{
printf("输入出错!");
exit(0);
}
}
}
//加法
void add(int *a, int *b, int *c)
{
int k = 0, i, max_len;
max_len = a[0];
if(b[0] > max_len)
max_len = b[0];
for(i=0; i<max_len; i++)
{
k = k + a[i+1] + b[i+1];
c[i+1] = k%10;
k = k/10;
}
if(k != 0)
{
c[i+1] = k;
c[0] = i+1;
for(; i<MAX-2; i++)
c[i+2] = 0;
}
else
{
c[0] = i;
for(; i<MAX-1; i++)
c[i+1] = 0;
}
}
//比较两个数组表示的整数的大小,a>b返回1,否则返回0
int compare(int *a, int *b)
{
int i;
if(a[0] > b[0])
return 1;
else if(a[0] == b[0])
{
for(i=0; i<a[0]; i++)
{
if(a[a[0]-i] > b[b[0]-i])
return 1;
}
return 2;
}
else
return 0;
}
//减法
void subABigerB(int *a, int *b, int *c)
{
int i;
for(i=1; i<a[0]+1; i++)
{
if(a[i] >= b[i])
{
//k = 0;
c[i] = a[i] - b[i];
}
else
{
//k = 1;
while(a[i+1] == 0)
i++;
a[i+1]--;
c[i] = a[i] + 10 - b[i];
}
}
c[0] = a[0];
}
//减法
void sub(int *a, int *b, int *c)
{
int i;
for(i=0; i<MAX; i++)
{
c[i] = 0;
}
if(compare(a, b) == 1)
{
subABigerB(a, b, c);
//打印
printf("Difference: ");
i = c[0];
while(c[i] == 0)
i--;
for(; i>0; i--)
{
printf("%d",c[i]);
}
printf(" ");
}
else if(compare(a, b) == 0)
{
subABigerB(b, a, c);
//打印
printf("Difference: ");
i = c[0];
while(c[i] == 0)
i--;
printf("-");
for(; i>0; i--)
{
printf("%d",c[i]);
}
printf(" ");
}
else
//打印
printf("Difference: 0 ");
}
//数组与单个整数的乘法
void singleMul(int *a, int m, int *c)
{
int k = 0, i;
for(i=0; i<a[0]; i++)
{
k = k + a[i+1] * m;
c[i+1] = k%10;
k = k/10;
}
if(k != 0)
{
c[i+1] = k;
c[0] = i+1;
}
else
c[0] = i;
}
//整数数组之间的乘法
void mul(int *a, int *b)
{
int k = 0, i, c[MAX], d[MAX], e[MAX], max_len;
int f = 0, j;
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
max_len = a[0];
if(b[0] > max_len)
max_len = b[0];
//d = singleMul(a, b[1]);
for(i=0; i<b[0]; i++)
{
singleMul(a, b[i+1], c);
if(i-1>=0)
d[0] = d[0]-1;
d[1] = d[0];
add(&d[1], c, d);
e[i+1] = d[1];
}
for(j=0; j<d[0]-1; i++,j++)
{
e[i+1] = d[2+j];
}
e[0] = i;
//打印
for(i=e[0]; i>0; i--)
{
printf("%d",e[i]);
}
printf(" ");
}
int main()
{
int a[MAX],b[MAX],c[MAX],a_len,b_len,max_len;
int i;
//清零
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
read(a);
read(b);
//加法
add(a, b, c);
printf("Sum: ");
//打印
for(i=c[0]; i>0; i--)
{
printf("%d",c[i]);
}
printf(" ");
//printf("%d",compare(a, b));
//减法
sub(a, b, c);
//乘法
printf("Product: ");
mul(a, b);
//system("pause");
}
#include<stdio.h>
#include<string.h>
//最大数长度
#define MAX 200
//读入输入的大整数,a[0]存储大整数的长度
void read(int *a)
{
unsigned int i,len;
char s[MAX];
scanf("%s",&s);
a[0] = strlen(s);
for(i=0; i<a[0]; i++)
{
if(s[i]>='0' && s[i]<='9')
a[a[0]-i] = s[i]-'0';
else
{
printf("输入出错!");
exit(0);
}
}
}
//加法
void add(int *a, int *b, int *c)
{
int k = 0, i, max_len;
max_len = a[0];
if(b[0] > max_len)
max_len = b[0];
for(i=0; i<max_len; i++)
{
k = k + a[i+1] + b[i+1];
c[i+1] = k%10;
k = k/10;
}
if(k != 0)
{
c[i+1] = k;
c[0] = i+1;
for(; i<MAX-2; i++)
c[i+2] = 0;
}
else
{
c[0] = i;
for(; i<MAX-1; i++)
c[i+1] = 0;
}
}
//比较两个数组表示的整数的大小,a>b返回1,否则返回0
int compare(int *a, int *b)
{
int i;
if(a[0] > b[0])
return 1;
else if(a[0] == b[0])
{
for(i=0; i<a[0]; i++)
{
if(a[a[0]-i] > b[b[0]-i])
return 1;
}
return 2;
}
else
return 0;
}
//减法
void subABigerB(int *a, int *b, int *c)
{
int i;
for(i=1; i<a[0]+1; i++)
{
if(a[i] >= b[i])
{
//k = 0;
c[i] = a[i] - b[i];
}
else
{
//k = 1;
while(a[i+1] == 0)
i++;
a[i+1]--;
c[i] = a[i] + 10 - b[i];
}
}
c[0] = a[0];
}
//减法
void sub(int *a, int *b, int *c)
{
int i;
for(i=0; i<MAX; i++)
{
c[i] = 0;
}
if(compare(a, b) == 1)
{
subABigerB(a, b, c);
//打印
printf("Difference: ");
i = c[0];
while(c[i] == 0)
i--;
for(; i>0; i--)
{
printf("%d",c[i]);
}
printf(" ");
}
else if(compare(a, b) == 0)
{
subABigerB(b, a, c);
//打印
printf("Difference: ");
i = c[0];
while(c[i] == 0)
i--;
printf("-");
for(; i>0; i--)
{
printf("%d",c[i]);
}
printf(" ");
}
else
//打印
printf("Difference: 0 ");
}
//数组与单个整数的乘法
void singleMul(int *a, int m, int *c)
{
int k = 0, i;
for(i=0; i<a[0]; i++)
{
k = k + a[i+1] * m;
c[i+1] = k%10;
k = k/10;
}
if(k != 0)
{
c[i+1] = k;
c[0] = i+1;
}
else
c[0] = i;
}
//整数数组之间的乘法
void mul(int *a, int *b)
{
int k = 0, i, c[MAX], d[MAX], e[MAX], max_len;
int f = 0, j;
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
max_len = a[0];
if(b[0] > max_len)
max_len = b[0];
//d = singleMul(a, b[1]);
for(i=0; i<b[0]; i++)
{
singleMul(a, b[i+1], c);
if(i-1>=0)
d[0] = d[0]-1;
d[1] = d[0];
add(&d[1], c, d);
e[i+1] = d[1];
}
for(j=0; j<d[0]-1; i++,j++)
{
e[i+1] = d[2+j];
}
e[0] = i;
//打印
for(i=e[0]; i>0; i--)
{
printf("%d",e[i]);
}
printf(" ");
}
int main()
{
int a[MAX],b[MAX],c[MAX],a_len,b_len,max_len;
int i;
//清零
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
read(a);
read(b);
//加法
add(a, b, c);
printf("Sum: ");
//打印
for(i=c[0]; i>0; i--)
{
printf("%d",c[i]);
}
printf(" ");
//printf("%d",compare(a, b));
//减法
sub(a, b, c);
//乘法
printf("Product: ");
mul(a, b);
//system("pause");
}
相关文章推荐
- PAT Basic 1034. 有理数四则运算(20)(C语言实现)
- C语言实现大数四则运算
- PAT (Basic Level) Practise (中文)1034. 有理数四则运算(20) C语言
- Linux系统下用C语言实现浮点数四则运算表达式的求值
- PAT乙级1034(C语言)-有理数四则运算(20)
- 判断C语言的算术运算越界问题
- C语言中整型运算取Ceiling问题
- C语言 malloc()与sizeof运算的盲点
- 利用C语言写一个可以进行乘方运算的程序
- C语言基本运算
- 关于C语言中逻辑运算和位运算的差别(记一笔)
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中的自增运算
- 四则运算(C语言)
- C语言编写程序,实现多个非负整数四则运算的功能
- C语言中的位移运算
- C语言基础一(位运算)
- 位运算02 - 零基础入门学习C语言65(完)
- 黑马程序员——C语言基本运算