当前位置: 代码迷 >> 综合 >> acwing 3734求和
  详细解决方案

acwing 3734求和

热度:74   发布时间:2023-11-22 11:49:12.0

用 f(x) 来表示满足下列条件的最小正整数 a:
a≥x。
a 的各个数位不包含除了 4 和 7 以外的其他数字。
现在,给定两个整数 l,r(l≤r),请你计算 f(l)+f(l+1)+…+f? 的值。
输入格式
一行,两个整数 l,r。
输出格式
一行,一个整数表示求得的和。
数据范围
前三个测试点满足 1≤l≤r≤10,
所有测试点满足 1≤l≤r≤109。
输入样例1:
2 7
输出样例1:
33
输入样例2:
7 7
输出样例2:
7
解题思路:
先用暴力将10^9以内的所有由4和7组成的数字求出来并进行排序,在通过遍历找出 l 和 r 这个区间的数的总和
代码实现:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
#define ll long long
const ll maxn=1e9,Inf=4000;
ll num[Inf];
int sum=0;
void v(ll n){
    //利用递归求出所有由4,7组成的数字 if(n>maxn)return ;//当数字超过10^9时退出ll m=n*10+4;num[sum++]=m;v(m);m=n*10+7;num[sum++]=m;v(m);
}
int main(){
    v(0);sort(num,num+sum);//排序ll a,b;cin>>a>>b;int start,end;ll h=0;for(int i=0;i<sum;i++){
    if(num[i]>=a){
    if(num[i]<=b){
    if(num[i-1]<a)h+=(num[i]-a+1)*num[i];else h+=(num[i]-num[i-1])*num[i];  }else if(num[i-1]<=b&&num[i-1]>=a){
    h+=(b-num[i-1])*num[i];}else if(num[i]>=b&&num[i-1]<=a){
    h+=(b-a+1)*num[i];break;}}}printf("%lld\n",h);return 0;
}