1. 程式人生 > >[規律]Snuke Numbers

[規律]Snuke Numbers

題目描述

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.
 

 

輸入

Input is given from Standard Input in the following format:

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; }