制作钓鱼网站,常用网站开发语言,住房城乡建设部官网站,济南 网站建设那家好题目见#xff1a;P1601 AB Problem#xff08;高精#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1. 问题分析 加法计算问题应该和在界面输出“Hello,world!”是一个难度级别#xff0c;但是问题在于受限于原始数据类型的限制#xff0c;无法进行大数据的精…题目见P1601 AB Problem高精 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1. 问题分析 加法计算问题应该和在界面输出“Hello,world!”是一个难度级别但是问题在于受限于原始数据类型的限制无法进行大数据的精确的加法运算。即使双精度浮点数计算近似值最大数差不多是308位数字超过这个位数也是无法计算的。那这样就有问题了利用原始的数据类型是无法存储一个任意大的整数的需要自定义类型和运算和实现。Java中就有这种类型python的加法也可以实现。那么如果用C来写的话应该如何去做呢做法很多美丽的做法也跟多我只是从个人角度出发来考虑这个问题 其实想法很简单我们用数组来表示一个整数有多少位数组的长度就设置多少完了。比如存储123.
#includeiostream
using namespace std;
int main(){int a[3] {1,2,3};return 0;
} 这样以来我们就可以通过两个数组来表示两个整数通过两个数组来利用加法的运算规则来进行计算了。
2. 计算步骤
2.1 输入问题 题目输入的是两个整数我们用什么来接收这两个数字呢任意长度的我们可以用字符串来接收这两个整数。
#includebits\stdc.h
using namespace std;
int main(){string a, b;cin a;cin b;return 0;
}
2.2 字符串转化为整数数组
2.2.1 位置关系 我们需要将字符串的最后一位也就是个位数放置在整数数组的第0个位置将倒数第二个位置的字符转为整数放置在整数数组的第1个位置一次类推。
2.2.2 类型转化 字符串(string)实际上是一个字符数组字符串的每个位置是一个char类型char类型采用ascii来存储acsii对于0~9的数字是连续存储的因此只需要用字符串每个位置的char类型减去字符0既可。
2.2.3 代码实现
#includebits\stdc.h
using namespace std;void str2char_arr(string str, int a[]){int n str.size();for (int i n-1; i0; i--){a[n-i-1] str[i] - 0;}
}
void display(int a[], int n, bool reverse){for (int i 0; i n; i){if (reverse true){cout a[n-1-i];}else{cout a[i];}}
}
int main(){string str1, str2;int a[500];int b[500];cin str1;cin str2;str2char_arr(str1, a);str2char_arr(str2, b);display(a, str1.size(), false);return 0;
}
2.3 定义加法运算 加法运算的规则如下 1. 从左到右依次计算 2. 两个数组的数字对应位置相加加上上一次的进位上次进位为上次的和除以10的商然后对10取余。 注意可以根据题目中数据的大小约束设置较大的数组并且两个数组的大小一致这样有点浪费空间和时间。后面可以用可变数组来优化。
#includebits\stdc.h
using namespace std;void str2char_arr(string str, int a[]){int n str.size();for (int i n-1; i0; i--){a[n-i-1] str[i] - 0;}
}
void display(int a[], int n, bool reverse){for (int i 0; i n; i){if (reverse true){cout a[n-1-i];}else{cout a[i];}}
}void add(int a[], int b[], int c[], int n){int t 0;for (int i 0; i n; i){t a[i] b[i];c[i] t%10;t / 10;}
}int main(){string str1, str2;int a[501];int b[501];int c[501];int n 501;cin str1;cin str2;memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));str2char_arr(str1, a);str2char_arr(str2, b);add(a, b, c, n);while(c[n-1] 0 n 1){n--;}display(c, n, true);return 0;
}
2.4 逆序输出 计算的时候从个位数开始计算个位数的索引小所以输出的时候需要逆序输出。另外就是要从第一个不为0的数字输出。
3. 优化 这只是一个初级版本优化空间很大。