今天老师讲了如何用C语言来做大数与大数的运算
废话少说,下面是正文
#源代码+注释
//高精度合集(我把它做成了一个小程序,大家复制下来运行)
#include <stdio.h> //标准输入输出头文件
#include <string.h> //字符串头文件
#include <math.h> //数学函数
#include <stdlib.h>
char s[10001],ss[10001]; //定义全局变量供下面的程序使用
int a[10001],b[10001],c[10001];
char arr[1000000],cha[1000000];
int d,len;
int Compare(char a[],char b[]) //比较字符串的大小,方法不同于strcmp函数,类似于整型常量的比较
{
int lena,lenb,i;
lena=strlen(a); //a的长度
lenb=strlen(b); //b的长度
if(lena<lenb)
return -1; //如果a的长度比b小,返回-1
else if(lena>lenb)
return 1; //不是,返回1
else
{
if(strcmp(a,b)==0)
return 0;
else
{
for(i=0;i<lena;i++)
{
if(a[i]>b[i])
return 1;
if(a[i]<b[i])
return -1;
}
return 0;
}
}
}
int Judge(char ch[]) //判断字符串ch是否全为0,若全为0,返回1,否则返回0
{
int i,k;
k=strlen(ch);
for(i=0;i<k;i++)
if(ch[i]!='0')
return 0;
return 1;
}
/*-------------高精度加法--------------*/
void jia() //自定义函数"jia"(名字low了一点(好像不是一点,但容易理解不是吗))
{
int l1 = strlen(s); //"strlen"是一个计算字符串长度的函数
int l2 = strlen(ss); //将输入的两个字符串的长度赋值给l1,l2
if (l1 > l2)
len = l1; //将len赋值为l1,l2中大的那个
else
len = l2;
// for (int i = 0 ; i <= len ; i++) //清零(这里for循环和下面三句memset都为将字符串清零 )
// a[i] = b[i] = c[i] = 0;
memset(a,0,sizeof(a)); //清零too(只能清零,不能干别的)
memset(b,0,sizeof(b)); //这是清零函数(字符串)
//两个for循环是将输入的两个字符串倒过来
for (int i = l1 - 1 ; i >= 0 ; i--) //再将字符串里的字符转换为数字赋值给a,b整型数组
a[l1 - i - 1] = s[i] - '0'; //但为什么大数要用字符串存呢?
for (int i = l2 - 1 ; i >= 0 ; i--) //因为大数太大,用任何整型变量都存不下
b[l2 - i - 1] = ss[i] - '0'; //为什么要把字符串倒过来赋值呢?
//因为大数与大数是一位一位运算的,还要涉及进位等
for (int i = 0 ; i < len ; i++)
{
a[i] = a[i] + b[i]; //运算
a[i+1]+= a[i] / 10; //如有进位,在后一位上加上
a[i] = a[i] % 10; //原来那一位减掉进位了的
}
if (a[len] != 0)
len++; //如果有进位就多显示一位(这句话很重要)
printf("结果:\n");
printf("%s + %s = ",s,ss);
for (int i = len - 1 ;i >= 0 ;i--) //输出结果
printf("%d",a[i]);
printf("\n");
} //高精度加法你懂了吗?
/*-------------高精度减法--------------*/
void jian()
{
int l1 = strlen(s); //字符串长度
int l2 = strlen(ss);
int flag = 0; //一个记录正负的变量(后面就知道啦)
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
if ( l1 < l2 || (strcmp(s,ss) < 0 && l1 == l2) ) //这个比较重要是来判断前后两数的大小的
{
//不然一个小的数减一个大的数是大于零的就尴尬了
flag = 1; //这里是把正负记录下来
for (int i = l2 - 1 ; i >= 0 ; i--) //倒过来输入
a[l2 - i - 1] = ss[i] - '0'; //将字符串里的字符转换为数字
for (int i = l1 - 1 ; i >= 0 ; i--)
b[l1 - i - 1] = s[i] - '0';
}
else
{