题目描述
Let S(n) denote the sum of the digits in the decimal notation of n. For example, S(123)=1+2+3=6.
We will call an integer n a Snuke number when, for all positive integers m such that m>n,
holds.
Given an integer K, list the K smallest Snuke numbers.
Constraints
1≤K
The K-th smallest Snuke number is not greater than 1015.
We will call an integer n a Snuke number when, for all positive integers m such that m>n,
holds.Given an integer K, list the K smallest Snuke numbers.
Constraints
1≤K
The K-th smallest Snuke number is not greater than 1015.
输入
Input is given from Standard Input in the following format:
K
K
输出
Print K lines. The i-th line should contain the i-th smallest Snuke number.
样例输入
复制样例数据
10
样例输出
1
2
3
4
5
6
7
8
9
19
思路:找到规律如下:

即只需在加到9时判断下一次是加第一位还是第二位
AC代码:
#include <iostream> #include<cstdio> typedef long long ll; using namespace std; double f(ll x){ ll sum=0; ll cop=x; while(x){ sum+=x%10; x/=10; } return cop*1.0/(sum*1.0); } int main() { //printf("%.6f %.6f\n",f(20999),f(21999)); ll k;scanf("%lld",&k); ll tot=0; ll now=0,x=1; while(tot<k){ if((now/x)%10!=9){ now+=x; printf("%lld\n",now);tot++; } else{ if(f(now+x)>f(now+10*x)){ x=10*x; } now+=x; printf("%lld\n",now);tot++; } //printf("tot=%lld \n",tot); } return 0; }
本文介绍了一种高效算法,用于找出特定条件下的Snuke数。Snuke数是一种特殊的整数,其特性在于当任何大于它的正整数m的数字和与其自身的数字和之比小于等于1时成立。文章提供了详细的算法思路和AC代码实现,通过判断加到9时的操作,巧妙地解决了问题。

942

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



