题目描述

每一轮求出[p, q]区间内数字的个位数的和,并计入总和;再将[p, q]区间内个位数为0的数除以10,产生新区间,进入下一轮,再求新区间内数字的个位数的和,并计入总和,而个位数为0的数除以10,产生新区间;以此类推;直到[p, q]区间内的数只有个位数
此题有一定难度,需要多多思考
#include<iostream>
using namespace std;
#define ll long long
ll sum;
ll f(ll x){
if(x==0)
return 0;
else if(x%10)
return x%10;
else
return f(x/10);
}
void solve(ll p,ll q){
if(q-p<9){
for(int i=p;i<=q;i++)
sum+=f(i);
return ;
}
while(p%10){
sum+=f(p);
p++;
}
while(q%10){
sum+=f(q);
q--;
}
sum+=45*(q-p)/10;
solve(p/10,q/10);
}
int main(){
ll p,q;
while(cin>>p>>q){
if(p<0&&q<0)
return 0;
sum=0;
solve(p,q);
cout<<sum<<endl;
}
}
本文介绍了一种算法,该算法用于计算指定区间[p,q]内所有数字的个位数之和。通过递归地缩小区间范围并累加个位数来实现。当区间内的数字仅剩个位数时停止计算。
1609

被折叠的 条评论
为什么被折叠?



