codeforces-1538-f(思维)

18 篇文章 0 订阅

写在前面:

参考博客:live4m

很有意思的一个题。

---------------------------------------------------------------------------------------------------------------------------------

原题链接:

F. Interesting Function

题目大意:

给你两个整数l和r,其中l<r。我们将在l上加1,直到结果等于r为止。对于每一个这样的加法,让我们看看在它之后会有多少个数字被改变。

比如说。

如果l=909,那么加1的结果是910,有2位数字会被改变。
如果你在l=9的基础上加1,结果将是10,2位数字也将被改变。
如果你在l=489999上加一,结果将是490000,5个数字将被改变。
被改变的数字总是构成以十进制系统书写的结果的后缀。

输出改变的数字总数,如果你想从l得到r,每次加1。

输入
第一行包含一个整数t(1≤t≤104)。接着是t个测试用例。

每个测试用例都有两个整数l和r(1≤l<r≤109)。

输出
对于每个测试案例,如果你想从l得到r,计算改变的数字总数,每次加一个。

解题思路:

发现询问是形如[l,r]的一个区间,
那么可以将问题变成[0,r]-[0,l].

设cal(x)为[1,x]的值,
考虑cal(x)如何计算:
按十进制位考虑贡献,
个位变化的次数为x,
十位变化的次数为x/10,
百位变化的次数为x/10/10,

AC代码:

#include <iostream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include <vector>
#include <string>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <unordered_map>
#define guo312 std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define ll long long
#define Inf LONG_LONG_MAX
#define inf INT_MAX
#define endl "\n"
using namespace std;
int getnum(int num){
	int re=0;
	while(num){
		re+=num,num/=10;
	}
	return re;
}
int main(){
guo312;
	int t; cin>>t;
	while(t--){
		int l,r; cin>>l>>r;
		cout<<getnum(r)-getnum(l)<<endl;
	} 
	return 0;
}
 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

要用bug来打败bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值