シンプルなゲーム(easygame)

簡単なゲーム(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 112 223 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 441 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桁で表示されることがわかる11回なぜなら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;
}

おすすめ

転載: blog.csdn.net/weixin_43346722/article/details/108148776