每日一题之召唤数学精灵

发布于:2025-03-09 ⋅ 阅读:(138) ⋅ 点赞:(0)

问题描述

数学家们发现了两种用于召唤强大的数学精灵的仪式,这两种仪式分别被称为累加法仪式 A(n) 和累乘法仪式 B(n)。

累加法仪式 A(n) 是将从 1 到 n 的所有数字进行累加求和,即:A(n)=1+2+⋯+n累乘法仪式 B(n) 则是将从 1 到 n 的所有数字进行累乘求积,即:B(n)=1×2×⋯×n据说,当某个数字 ii 满足 A(i)−B(i)能被 100 整除时,数学精灵就会被召唤出来。

现在,请你寻找在 1 到 2024041331404202 之间有多少个数字 i,能够成功召唤出强大的数学精灵。

答案提交

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include <iostream>
using namespace std;
long long addsum(int n){
  long long sum=0;
  for(long long i=1;i<=n;i++){
    sum+=i;
  }
  return sum;
}
long long pulsum(int n){
  long long sum=1;
  for(long long i=1;i<=n;i++){
    sum*=i;
  } 
  return sum;
}
int main()
{
  // 请在此输入您的代码
  for(long long i=1;i<5000;i++){
    if((addsum(i)-pulsum(i))%100==0){
      cout<<i<<" ";
    }
  }
  return 0;
}

这道题给出的数据太大,直接用题目给的数据找根本跑不出来代码。那么当数据量太大的时候就只能去找规律,我选择找5000以内的数,后面发现其实当i=21的时候就已经超过long long的数据范围了。

继续思考,阶乘的话,其实当i>=10的时候就一定能被100整除,因为2*5*10的等于100,再乘多少都一样,所以我们只需要去找出10以内的数,满足条件的。

#include <iostream>
using namespace std;
long long addsum(int n){
  long long sum=0;
  for(long long i=1;i<=n;i++){
    sum+=i;
  }
  return sum;
}
long long pulsum(int n){
  long long sum=1;
  for(long long i=1;i<=n;i++){
    sum*=i;
  } 
  return sum;
}
int main()
{
  // 请在此输入您的代码
  for(long long i=1;i<10;i++){
    if((addsum(i)-pulsum(i))%100==0){
      cout<<i<<" ";
    }
  }
  return 0;
}

满足条件的只有1和3,然后其实可以不用管阶乘,直接去找求和之后能被100整除的,10到1000满足条件的数有这么多。

然后找规律,24,75,99,00,每200个数里面有4个,根据以下规律就很好找了。

还有大佬推导了一段公式:


网站公告

今日签到

点亮在社区的每一天
去签到