EVERYTHING HAPPENS FOR THE B|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-05-17 21:05阅读: 23评论: 0推荐: 0

abc234_e Arithmetic Number 题解

Arithmetic Number

题意

一个数 n 被称为等差数当且仅当它满足以下条件:

  • n=d1d2dkkn 的位数。
  • d2d1=d3d2==dkdk1,即序列 d 为等差数列。
  • 注意,当 k=1d 也算做等差数列。

给定一个整数 X,求一个最小的 Y 使得 YX 并且 Y 为等差数。

思路

暴力

一个一个数去枚举,每枚举一个就做一次判断,找到第一个等差数,输出。

正解

暴力时间复杂度肯定过不了。

首先,我们可以发现,等差数是非常少的,直接枚举会去判断太多的不合法答案。

但是,我们知道,等差数是必须长成一个等差数列的样子,也就是说,只要枚举一下首项和公差,就能推出整个等差数列。

但还有个问题,我们不清楚它要多少位啊 (其实不知道要多少位也是可以做的)

我们知道,n 位数里面最大的数肯定是 10n1,整个数由 n9 组成,这时,我们就会惊喜地发现:它必然是一个等差数

所以,只要取这个等差数列的前 k 位(kX 的位数),判断它是否大于等于 X 即可,如果不成立,那么也不用考虑选更多位了,这个等差数列一定不是构成答案的等差数列

最后只需要注意判断等差数列中不能出现大于 9 或小于 0 的数即可。

Code

点击查看代码
#include <iostream>
using namespace std;
long long x, y, le; // 记得开 long long
int t, flag, sum, st;
int main(){
ios::sync_with_stdio(0), cin.tie(0);
cin >> x;
le = x;
while (le) { // 求 x 的位数
st = le % 10, le /= 10;
sum++;
}
for (int i = st; i <= 9; i++) { // 优化一下,枚举首项
for (int d = -9; d <= 9; d++) { // 枚举公差
y = i, t = i, flag = 1;
for (int j = 1; j < sum; j++) { // 枚举每一位
t += d;
if (t > 9 || t < 0) { // 判断不合法的情况
flag = 0;
break;
}
y = y * 10 + t;
}
if (flag && y >= x) { // 是一个大于 X 的等差数
cout << y;
return 0; // 结束
}
}
}
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17410289.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(23)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
战 歌 - 此去经年
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 此去经年

作曲 : 此去经年

编曲 : 此去经年

啊啊啊啊啊

啊啊啊啊

啊啊啊

啊啊

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示