简单游戏(easygame)
簡單游戲(easygame)?\operatorname{簡單游戲(easygame)}簡單游戲(easygame)
題目鏈接:SSL比賽?1507?\operatorname{SSL比賽\ 1507}SSL比賽?1507
題目
一天,小 R 準備找小 h 去游泳,當他找到小 h 時,發現小 h 正在痛苦地寫著一列數, 111 , 222 , 333 , ……… , nnn ,于是就問小 h 痛苦的原因,小 h 告訴他,現在他要算 1..n1..n1..n 這些數里面, 111 出現的次數是多少,如 n=11n=11n=11 的時候,有 1,10,111,10,111,10,11 共出現 444 次 111 ,現在給出 n,n,n, 你能快速給出答案么?
輸入
一行,一個整數 nnn
輸出
一個整數,表示 1..n1..n1..n 中 111 出現的次數。
樣例輸入
11樣例輸出
4數據范圍
對于 30%30\%30% 的數據: n<=1000;n<=1000;n<=1000;
 對于 100%100\%100% 的數據: n<=maxlongint;n<=maxlongint;n<=maxlongint;
思路
這道題是一道數學題,要分類討論。
我們一位一位的求:
 對于個位,每十個這里就出現了 111 個 111 ;對于十位,每百個這里就出現了 101010 個 111 ;對于百位,沒千個就出現了 100100100 個 111 。
那它前面組成的數字就是有多少個每一個,或者十個,百個,等等。
 (想 233233233 ,對于十位,就有 222 個 101010 )
接著就來看它這一位,可以發現,如果這一位是 000 ,就正常。如果這一位大于 111 ,就會多一個每一個,或者十個,百個,等等。
但是如果這一位等于 111 呢?
 那我們發現,它后面組成的數字就是多了多少次 +1+1+1 。
 為什么要加一呢?就是因為比如 101010 ,在看到十位的時候,雖然后面組成的數字是 000 ,但是可以看出十位出現了 111 次 111 。因為 101010 里面十位是有一個 111 的。
代碼
#include<cstdio> #define ll long longusing namespace std;ll n, ans; ll more, times, sheng;int main() {scanf("%lld", &n);//讀入for (ll wei = 1; wei <= n; wei *= 10) {//枚舉每一位more = n % (wei * 10) / wei;//這一位times = n / (wei * 10);//它前面組成的數字sheng = n % wei;//它后面組成的數字if (more > 1) ans += times * wei + wei;else if (more == 1) ans += times * wei + sheng + 1;//分類討論else ans += times * wei;}printf("%lld", ans);//輸出return 0; }總結
以上是生活随笔為你收集整理的简单游戏(easygame)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java接口构建英雄属性_Python接
- 下一篇: 后端技术:Spring Boot 项目打
