Large sum
Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.
大和
求以下一百个50位数之和的前十位数字。
这一道题目肯定用普通的类型是存不下当前值的,longlong类型也不够(python除外),因为博主用的语言都是C语言所以只有用其他方法进行对于当前的题目进行计算。
如果没有类型可存的下,那用数组的呢,一位一位的将树存进数组呢好像可以了是吧,但是如果高位存在低位的话,进位就比较麻烦了,如果发生了进位,那所有的数都要往后移动一位那就比较麻烦,所以呢需要把数倒过来存,进位的时候只需要加一位即可;
现在处理好了进位的问题,那循环结束的问题呢相加时,难道每次相加都要去判断当前数组的长度嘛?我觉得不用,只需要把存当前数组的第0位用来存当前数的位数就不用再去每次判断数组的长度了;
相加个过程其实和草稿纸上的竖式完成过程是一样的,下面来看代码如何写:
#include <stdio.h> #include <string.h> void charToint(char *a, int *b) { b[0] = strlen(a); for (int i = 1, j = b[0] - 1; j >= 0; j--, i++) { b[i] = a[j] - '0'; } return ; } void add(int *a, int *b) { for (int i = 1; i <= a[0]; i++) { a[i] += b[i]; if (a[i] < 10) continue; a[i + 1] += a[i] / 10; a[i] %= 10; a[0] += (i == a[0]);//如果当前最高位发生进位那就需要对于位数加一 } return ; } int main() { char arr[105][55] = {0}; for (int i = 0; i < 100; i++) { scanf("%s", arr[i]); } int sum[105][55] = {0}; int ans[60] = {0}; ans[0] = 50;//假设ans有50位的0方便后面计算 for (int i = 0; i < 100; i++) { charToint(arr[i], sum[i]);//进行对第一位赋值数字位数,再把数倒过来存入 add(ans, sum[i]);//进行大整数加法 } for (int i = ans[0]; i > ans[0] - 10; i--) { printf("%d", ans[i]); } putchar(10); return 0; }
最终答案为:5537376230