質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

224閲覧

AtCoderでTLEになってしまう原因

resasu

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/07/24 07:42

実現したいこと

下記の問題をACにしたい
https://atcoder.jp/contests/abs/tasks/abc083_b

発生している問題・分からないこと

下記コードを打ち込むとTLEになってしまう。計算量は大してないと思われるがなぜTLEになるのかが分からない。

エラーメッセージ

error

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int N; 6 int a,b; 7 cin >> N >> a>> b; 8 9 int ans =0; 10 11 for(int i=1 ; i<=N ; i++){//i=12345 12 int sum =0; 13 int A = i/10000; //A=1 14 i = i%10000; //2345 15 int B = i/1000; //B=2 16 i = i%1000; //345 17 int C = i/100; //C=3 18 i = i%100; //45 19 int D = i/10; //D=4 20 i = i%10;//5 21 int E = i; //E=5 22 sum = A+B+C+D+E; 23 24 if(sum>a && sum<b){ 25 ans++; 26 } 27 } 28 cout << ans << endl; 29}

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

解説動画を見ました。おおよそ同じようなコードでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

resasu

2024/07/24 07:47

24行目 if(sum>=a && sum<=b){ に修正します。 それでも、TLEです。
fana

2024/07/24 07:54

> for(int i=1 ; i<=N ; i++) ここで使っている i の値をループ内で書き換えている様子ですが,それで良いのですか?
resasu

2024/07/24 07:55

25行目 ans += i;
guest

回答1

0

ベストアンサー

c

1 for(int i=1 ; i<=N ; i++){ 2 ... 3 i = i%10;

ループ中でiが強制的に9以下になるので、Nが10以上ならループが終了しません。

投稿2024/07/24 07:56

int32_t

総合スコア21559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

resasu

2024/07/24 08:12

ありがとうございます。forのループの原理についてわかりきっていませんでした。 確認なのですが、 もし3行目でi=9となった場合、i++でi=10に更新され、またループが始まるという解釈でよろしいでしょうか?
fana

2024/07/24 08:20

「うっかりミス(?)で,ループ内で i を使用してしまった」みたいな至極どうでもいい話 ではない 状況なのであれば…… どこぞの問題に挑戦することを一端中断して,先に最低限の事柄を学んだ方が良いのではあるまいか. 先に基礎の基礎な事柄をちょろっと押さえてしまった方がすんなりいくと思う. 所要時間的にはせいぜい 数時間~数日 程度だろうし.
resasu

2024/07/24 08:34

たしかにそうですね。APG4bはやり終えて基礎は抑えたと思っていたところです。基礎が抑えられていないのはたしかですが、問題に挑戦することで、ひとつひとつの経験から学んでいきたいです。 ループ内でiは書き換えちゃだめなんだ!ということは今回の収穫になりました。 まだまだ、基礎が足りませんが、APG4b以外で勉強する方法はありますでしょうか?
fana

2024/07/24 08:56

> ループ内でiは書き換えちゃだめ 何かそういうルールみたいのがあるわけじゃないですよね. 別の質問で書いた「デバッグしてください」という話でも述べた記憶がありますが, 「それが妥当なのか間違いなのか」というのは,あなたがどういう処理を考えてそのコードを書いているのか次第です. 今回の場合だと「俺はこの処理をN回繰り返すぜ!」っていう意図があって for(int i=1 ; i<=N ; i++) というのを書いているのでしょうから,であれば,この繰り返し処理の途中で i の値を変更するというのは意図と反しているんじゃないですか?っていう話です. (ループの終了条件に用いている変数の値をいじくってしまったら,ループする回数が変わっちゃうと思うけど,それはやりたいことではないよね? っていう.) > APG4b以外で勉強する方法はありますでしょうか? APG4b というやつの中身を私は知りませんが, 「C言語の入門」みたいなのを謳う本とかサイトとかはたくさんあるでしょうから,ごくごく普通にそういうのを読むなりしてみても良いのではないでしょうか.
int32_t

2024/07/24 09:11

> もし3行目でi=9となった場合、i++でi=10に更新され、またループが始まるという解釈でよろしいでしょうか? よろしいですけども、「ループが始まる」というより「ループが続く」の方が誤解しにくいかもしれません。問題が起きるのはその後です。 i=10でループ内の処理をすると i = i%10 により i が 0 になります。iが11以上には絶対にならないので、ループが止まらないわけです。 ループ内の処理ではiを書きかえず、i を別の変数にコピーしてから処理すればいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問