欧拉计划第13题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初猿°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值