大数加法
1、简介
在1000000进制下实现两个大数加法,1000000进制的表示:0-999999,之所以用1000000进制是为了方便计算,同时这也是我们老师要求的。将十进制转成1000000进制,例: 123456789–>123 456789,为便利存储要到一个整型数组n[len],其中len=(InNum+5)/6,就例123456789,那么了n[len-1]=123,n[len-2]=456789,这样就将一个十进制数转成1000000进制。
2、核心代码:将十进制转成1000000进制
int InNum, c, i, j, k, l;
char s[Num] = {'0'};//初始化
InNum = 0;
i = 0;
j = 0;//初始化赋值
while ((c = fgetc(stdin)) != EOF && c != '\n') {//输入数
if (i < Num)
s[i++] = c; //存入字符数组
else
break;
}
l = strlen(s);
k = (l + 5) / 6; //转换成1000000进制时数的长度
for (i = 0; i < strlen(s); i++) {
//例: 输入:12345678 格式化:n={'1','2','3','4','5','6','7','8','9'}-->a={123,456789},转化成1000000进制
InNum = InNum * 10 + s[i] - '0';
j++;
if (((i + 1) == (l % 6)) && ((l % 6) != 0)) { //当输入的数对6取余不为0时,余的长度的数,例:123456789--> 123 456789 ,InNum=123
a[--k] = InNum;
j = 0;
InNum = 0;
continue;
}
if (j % 6 == 0) { //当输入的数对6取余为0时,例:123456789--> 123 456789 ,InNum=456789
a[--k] = InNum;
InNum = 0;
}
}
3、完整代码
#include <stdio.h>
#include <string.h>
#define Base 1000000
#define Num 21//数组长度,Num-1是限定输入的数的长度
int sum[Num];//和
int n[Num - 1];//一个大数
int m[Num - 1];//一个大数
//读入大数
int ReadNum(int a[Num]) {
int InNum, c, i, j, k, l;
char s[Num] = {'0'};//初始化
InNum = 0;
i = 0;
j = 0;//初始化赋值
while ((c = fgetc(stdin)) != EOF && c != '\n') {//输入数
if (i < Num)
s[i++] = c; //存入字符数组
else
break;
}
l = strlen(s);
k = (l + 5) / 6;
for (i = 0; i < strlen(s); i++) {
//例: 输入:12345678 格式化:n={'1','2','3','4','5','6','7','8','9'}-->a={123,456789},转化成1000000进制
InNum = InNum * 10 + s[i] - '0';
j++;
if (((i + 1) == (l % 6)) && ((l % 6) != 0)) { //当输入的数对6取余不为0时,余的长度的数,例:123456789--> 123 456789 ,InNum=123
a[--k] = InNum;
j = 0;
InNum = 0;
continue;
}
if (j % 6 == 0) { //当输入的数对6取余为0时,例:123456789--> 123 456789 ,InNum=456789
a[--k] = InNum;
InNum = 0;
}
}
return (l + 5) / 6;
}
//大数相加
int AddNum(int a[Num - 1], int b[Num - 1], int l) {
int carry, i, add;
carry = 0;
for (i = 0; i < l; ++i) {
add = (a[i] + b[i])+ carry; //两数相加,并加上前一次的进位carry
sum[Num - i - 1] = (add % Base); //add对Base取余,达到去除当前进位.
carry = add / Base; //进位
if (carry != 0 && i == l - 1) { //是否进位,且为最后个数
sum[Num - i - 2] = carry;
}
}
if (carry != 0) //有进位总长度加1
return l + 1;
else
return l;
}
void PrintNum(int a[Num], int l) {
int i;
printf("sum: ");
for (i = Num - l; i < Num; i++) {
printf("%06d ", a[i]);
}
printf("\n");
}
//主函数
int main(int argc, char *argv[]) {
int i,lenN, lenM, lenS;
for (i = 0; i <Num-1 ; ++i) { //初始化数组
n[i]=0;
m[i]=0;
}
lenN = ReadNum(n); //获取第一个数的长度
lenM = ReadNum(m); //获取第二个数的长度
if (lenM >= lenN) //用长的加短的数
lenS = AddNum(n, m, lenM);
else
lenS = AddNum(m, n, lenN);
PrintNum(sum, lenS); //输出结果
}
4、总结
利用1000000进制来求大数的加法过程相对其他的算法会复杂一些,这涉及到了进制的转换。不过这也算是一种新的尝试吧,之前没有想过这样来做,利用1000000进制来做都是老师提出来的。以前想到的是同样是利用数组,但不用经过复杂的转换,只需将读取的字符串转成整型,然后存进数组就行了。两个整型数组进行逐位相加,然后利用一个数组存相加的结果。就简单说这么多。
5、相关文件:Github