簡単なゲーム(easygame)\ operatorname {easygame(easygame)} シンプルなシングルトリッププレイ(E A S Y G A m E )
トピックのリンク:SSLの競争1507\ operatorname {SSLの競争\ 1507}S S L 比レース1 。5 0 。7
トピック
ある日、小さなRは泳ぐための小さなhを見つけるつもりでしたが、小さなhを見つけると、小さなhが痛みのある数字の列を書いていることに気付きました1 11、2 22、3 33、………、nnn、それで私は少しhに彼の痛みの理由を尋ねました、そして少しhは今彼が1 .. n 1..nを数える必要があると彼に話しました1 。。N-内部これらの数字、11n = 11 n = 11など、 1が何回現れるかん=1 1には、1、10、11、1、10、11があります。1 、1 0 、1 1登場4 44回1 11、今、n、n、n 、あなたはすぐに答えを出すことができますか?
入る
1行、整数nnん
出力
1 .. n 1..nを表す整数1 。。N-で111出現回数。
入力例
11
出力例
4
データ範囲
30%30 \%。3 0 %データ:n-<= 1000; n-<= 1000;ん<=1 0 0 0 ;
のための100%100 \%。1 0 0 %データ:n-<= maxlongint; n-<= maxlongint;ん<=m a x l o n g i n t ;
アイデア
この質問は数学の質問であり、個別に説明する必要があります。
1つずつ求め
ています。1つは、10ごとに1 1がここに表示されます。1 Ge111 ; 10桁の場合、100ごとに10 10がここに表示されます1 0 Ge111 ;数百の場所の場合、数千がない場合は100 100になります。1 0 0 Ge111。
その前の数字は、それぞれの数、または10、100などです。
(233を考えて2332 3 3、十の位のために、そこにある2 22 Ge10101 0)
次に、このビットを見て、このビットが0の場合0 00、正常です。このビットが1より大きい場合11、それぞれ1つずつ、または10、100などになります。
しかし、このビットが1に等しい場合11?
次に、その背後にある数は、さらに何回+ 1 +1であることがわかりました+ 1。
なぜ追加するのですか?たとえば10 101 0、10の位を表示する場合、後ろの数字は0 0ですが0、ただし1 1が10桁で表示されることがわかる1回1回1。なぜなら10 10。10である 1 0 11の1。
コード
#include<cstdio>
#define ll long long
using 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;
}