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

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

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

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

Q&A

解決済

2回答

630閲覧

AtCoderABC176のB問題がWAになってしまう

beimax

総合スコア7

C++

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

0グッド

0クリップ

投稿2020/08/26 09:19

前提・実現したいこと

AtCoderの、ABC176のB問題についてです。
何個かのテストデータが通らず、WAになってしまいます。

###B問題
整数 Nが9の倍数であることと、Nを十進法で表したときの各桁の数の和が9
の倍数であることは同値です。
Nが9の倍数であるか判定してください。

######制約

  • 0<=N<10^200000
  • Nは整数

#####入力
標準出力から、Nが与えられる。

#####出力
Nが9の倍数ならば'Yes'、そうでないなら'No'を出力せよ。

該当のソースコード

C++を用いてプログラムを作成しています。 num は、入力の N です。

1、Nの格桁の和が9の倍数であることを用いました。

C++

1#include <stdio.h> 2#include <iostream> 3#include <cmath> 4#include <string> 5#include <algorithm> 6 7using namespace std; 8 9int main(){ 10 long long num, sum=0; 11 12 cin >> num; 13 14 while(num!=0){ 15 sum += num%10; 16 //cout << "sum =" << sum<<endl; 17 num = num/10; 18 //cout << "num = " << num << endl; 19 } 20 21 if(sum%9 == 0){ 22 cout << "Yes" << endl; 23 } 24 else{ 25 cout << "No" << endl; 26 } 27} 28

2、Nが9の倍数かどうかそのまま調べました。

C++

1#include <stdio.h> 2#include <iostream> 3#include <cmath> 4#include <string> 5#include <algorithm> 6 7using namespace std; 8 9int main(){ 10 long long num; 11 12 cin >> num; 13 14 if(num%9 == 0){ 15 cout << "Yes" << endl; 16 } 17 else{ 18 cout << "No" << endl; 19 } 20}

試したこと

2つのプログラムどちらも問題の入力例にある、

  • 123456789 -> Yes
  • 0 -> Yes
  • 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280 -> No

はうまくいきます。自分でも思いつくテストは試してみたのですが、うまくいっているように思えます。
通らないテストデータの例が思いつかないので、ご教授いただけると嬉しいです。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

long long の範囲より大きい数字が入ると
num = 9223372036854775807 になって全てNoになりますね
9999999999999999999999999999999999 →No

自分でテストケースを作る場合、
極端にデカい/小さい
明らかに合ってる/間違ってる
問題に出てきた境界の前後の数字 辺りを組み合わせて試してみるといいです

あと、受け取ったデータが正しく受け取れているか、をすぐ確認するように、
この場合だと
cin >> num;
の下に
cout << "num = " << num << endl;
を書く癖を付けとくとやりやすいです

投稿2020/08/26 09:47

編集2020/08/26 09:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

beimax

2020/08/26 10:23

ありがとうございます!これからそうする癖をつけます!
guest

0

ベストアンサー

データ型の範囲 | Microsoft Docs

long long ではオーバーフローしていませんか?
文字列から1文字ずつ取り出して、数値にして加算していけばいい気がします。

Visual C++ だとエラーで教えてくれました。

エラー: C2177: 定数が大きすぎます。

型が表せる値の範囲は numeric_limits で確認できます。

numeric_limits - cpprefjp C++日本語リファレンス

cpp

1#include <iostream> 2#include <limits> 3 4int main() 5{ 6 std::cout << "long long" << std::endl; 7 std::cout << "min " << std::numeric_limits<long long>::min() << std::endl; 8 std::cout << "max " << std::numeric_limits<long long>::max() << std::endl; 9 10 //long long 11 //min -9223372036854775808 12 //max 9223372036854775807 13} 14

サンプルコード

以下で AC しました。

cpp

1#include <iostream> 2#include <string> 3 4using namespace std; 5 6int main() 7{ 8 std::string input; 9 cin >> input; 10 11 // 文字列を1文字ずつ読み込んで、int に変換して加算する。 12 int sum = 0; 13 for (auto c : input) 14 sum += c - '0'; // char -> int 15 16 if (sum % 9 == 0) 17 cout << "Yes" << endl; 18 else 19 cout << "No" << endl; 20} 21

投稿2020/08/26 09:26

編集2020/08/26 09:38
tiitoi

総合スコア21956

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

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

beimax

2020/08/26 10:22

コードまで付けていただいてありがとうございます!理解できました。 桁数に気をつけなくてはいけないのですね。 この問題の模範解答を見ると、C言語では char s[200010]; とchar型の配列を作って数値を受け取っていたのですが、char型では何桁の数値まで受け取れるのでしょうか?200010という配列の大きさがどこから導かれたものなのかわかりませんでした...
tiitoi

2020/08/26 10:31 編集

オーバーフローを気にする必要があるのは入力を数値 (int や long long など) として変数に入れる場合です。 今回の場合、入力を文字列として変数に入れるので、オーバーフローは気にする必要がありません。 入力の最大値が 10^200000 という条件で、最大200000文字の数値列が入力されるということなので、余裕を持って200010文字分の配列を確保したのでしょう。 char s[200010]; に格納できるのは、ヌル文字を除いて 200009 文字まで格納できます。 C++ を使うのであれば、out of range のバグを避けるために、 文字列であれば、char * 配列ではなく、std::string 配列であれば、 c の配列 (例 int arr[1000] ) でなく、std::vector を使いましょう。
beimax

2020/08/26 10:31

ご回答ありがとうございます!本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問