- 大家好,我是海枫璐璐,以下内容是我们最近作业,我整理之后便分享在此,各位走过路过的 大神们 多多交流哦~~
如果各路神仙有空不妨点个赞,鼓励我不要脱发哈~
1.大数
首先,我们要知道什么是大数,大数就是指用我们平常常见的高级语言(C/C++) 的基本数据类型的最大长度都装不下的数据。例如:(57131278935467382462837648234294793287424727) 这些只能用 字符数组(char[])或者 字符串(string)来处理的大数。这里给大家介绍一下用字符串处理大数加法、大数乘法、大数比较大小(针对两位大数而言,并且都是正数)。
2.大数加法的实现思想
用字符串表示大数。将大数用十进制字符数组表示,模拟加法竖式计算的方法,从最低位开始相加,判断是否进1,一直到最高位。其中,注意要点:
-
将字符数组转化为整型数字数组。
-
因为大数与大数是一位一位运算的,还要涉及进位等,所以要把字符串倒过来赋值。
-
进位运算之后要倒序输出结果。
3.大数乘法的实现思想
跟加法思想一样用字符串表示大数。模拟乘法竖式计算的方法(第一步,是将乘数与被乘数逐位相乘;第二步,将逐位相乘得到的结果,对应相加起来)其中,注意要点:
-
乘法思想中用到了加法思想。
-
第一个大数的第 i 位与第二个大数的第 j 位相乘,结果应该存放在结果的第 i+j 位上的这个结果往后顺移一位(放到第i+j+1位),最后从右向左累加时就多了一个空间。
4.大数比较大小思想
与大数的加法和乘法一样,用字符串表示大数。其中,注意要点:
-
字符串长度不等时,通过字符串长度比较可以得出结果。
-
字符串长度相等时,利用数组从最低位到最高位依次比较,得出结果。
5.具体代码实现如下
#include <stdio.h>
#include <string.h>
#define M 1000 //定义了数量M是1000作为数组初始化的数量
char s1[M],s2[M],s[M];
int a[M],b[M],c[M];
int len,len1,len2,i,j;
//(一 )两个大整数相加
int Jia() //自定义函数 "jia"
{
len1 = strlen(s1); //"strlen"是计算字符串长度的函数
len2 = strlen(s2); //将输入的两个字符串的长度赋值给l1,l2
if (len1 > len2) //将len赋值为l1和l2中较长的那个
len = len1;
else
len = len2;
memset(a,0,sizeof(a)); //清零函数(字符串),实现数组初始化
memset(b,0,sizeof(b));
for(i=0;i<len1;i++) //两个for循环是将输入的两个字符串倒过来
a[i]=s1[len1-i-1]-'0'; //再将字符串里的字符转换为数字赋值给a,b整型数组
for(i=0;i<len2;i++) //大数太大,用任何整型变量都存不下 ,要用字符串存
b[i]=s2[len2-i-1]-'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++; //如果有进位就多显示一位
while (a[len - 1] == 0 && len>1) len--; //while去零
for (int i = len - 1 ;i >= 0 ;i--) //倒序输出结果
printf("%d",a[i]);
printf("\n");
}
//(二 )两个大数相乘
int C() //自定义函数"C"
{
len1 = strlen(s1); //"strlen"是计算字符串长度的函数
len2 = strlen(s2); //将输入的两个字符串的长度赋值给l1,l2
len=len1+len2; //保证相乘后的位数不会大于len
memset(a,0,sizeof(a));//初始化数组为0;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=0;i<len1;i++)
a[i]=s1[len1-i-1]-'0'; //将数字字符转化为数字;
for(i=0;i<len2;i++)
b[i]=s2[len2-i-1]-'0'; //把字符串s1和s2逆序用数字排列
for(i=0; i<len1; i++)
{
for(j=0; j<len2; j++)
{c[i+j]=c[i+j]+a[i]*b[j]; } //乘运算,把两数之积对应的每一位算出来 ,i,j从0开始往右左,后面进位运算
}
for(i=0;i<=len;i++)
{
if(c[i]>=10)
{ //进位运算
c[i+1]=c[i+1]+c[i]/10; //将十位上的数字进位
c[i]=c[i]%10; //将个位上的数字留下
}
}
i=len;
while(c[i]==0)//while去除前0
{i--;}
for(i=len; i>=0; i--) //倒序输出
printf("%d",c[i]);
printf("\n");
return 0;
}
//(三 )两数比较大小
int BJ()//自定义函数"BJ"
{
len1=strlen(s1);
len2=strlen(s2);
if(len1>len2)
printf("s1>s2\n");
if(len1<len2)
printf("s1<s2\n");
if(len1==len2)
{
for(i=0; i<len1; i++)
{
if(a[i]>b[i])
{
printf("s1>s2\n");
break;
}
if(a[i]<b[i])
{
printf("s1<s2\n");
break;
}
if(a[i]=b[i])
{
printf("s1=s2\n");
break;
}
}
}
}
int main()
{
printf("请输入两个大整数s1,s2,用空格隔开:\n");
scanf("%s%s",s1,s2);
printf("\n两数之和为:\n");
Jia();
printf("\n请输入两个大整数s1,s2,用空格隔开:\n");
scanf("%s %s",s1,s2);
printf("\n两数乘积为:\n");
C();
printf("\n请输入两个大整数s1,s2,用空格隔开:\n");
scanf("%s%s",s1,s2);
BJ();
}
新手上路,请多多鼓励哈~~