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

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

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

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

Q&A

2回答

469閲覧

AtCoderのABC問題の過去問

cunwe

総合スコア65

C++

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

0グッド

0クリップ

投稿2020/02/26 05:48

##問題文
長さ Nの整数列Aが与えられます。 Aの(添字の)異なる2要素の差の絶対値の最大値を求めてください。

##制約
2≤N≤100 1≤Ai≤10^9
入力はすべて整数である。
##入力
入力は以下の形式で標準入力から与えられる。

N

A1 A2...AN

##出力
Aの(添字の)異なる2要素の差の絶対値の最大値を出力せよ。
という問題で自分は以下のようにコンパイルを試みました。

#include <iostream> using namespace std; int A[1000000000000]; int main() { for (int i = 0; i < 1000000000000; ++i) { cin >> A[i]; if (A[i] < A[i+1]) { cout << A[i+1] << endl; } else { break; } cout << A[i+1] << endl; } }

すると、

/tmp/ccz30crh.o: In function `_GLOBAL__sub_I_A': Main.cpp:(.text.startup+0x145): relocation truncated to fit: R_X86_64_32 against `.bss' Main.cpp:(.text.startup+0x154): relocation truncated to fit: R_X86_64_32 against `.bss' collect2: error: ld returned 1 exit status

というエラーが帰ってきました。
1行目を見るとグローバル関数がどうたらって言ってるようなのですが指摘されている内容がわかりませんでした。また僕のコードは常に左から右にしか数字の大小を比べてない気がして少し違和感があるのですがどう直したら良いか教えていただけると幸いです、よろしくお願いします。

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

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

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

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

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

fana

2020/02/26 06:41

エラーについてはわかりませんが,それはそれとして,とりあえず題意に沿ったコードを書くことを行うべきではないかと思うのですが.
cunwe

2020/02/26 11:58

自分は隣り合った配列(A[i]とA[i+1])の大小を順番に比較していって大きかったら出力するプログラムを書いたつもりだったのですが、自分のプログラムがどう題意を満たしていないのかわからないので直すポイントを教えていただきたいです。
fana

2020/02/26 13:17

> Aの(添字の)異なる2要素の差の絶対値の最大値を出力せよ。 に対して, > 隣り合った配列(A[i]とA[i+1])の大小を順番に比較していって大きかったら出力 することが妥当なんでしょうか? 求められていることなんでしょうか?
cunwe

2020/02/26 16:37

すいません、言葉が足りませんでした。隣り合った配列(A[i]とA[i+1])の大小を順番に比較していって大きかったらその値を保持?して左から右に操作を行えば題意を満たせますか?
fana

2020/02/27 02:39 編集

実際にどのようなアルゴリズムを考えておられるのかわかりませんが,私がこの問題文を読めば「最後に結果値を1個だけ出力する」ことが求められていると捉えます.なので,値を複数個出力し得るコードは問題の内容を無視した意味不明なコードに見えます. Nが入力されると言っているのに,それを読む気はないみたいですし. また,仮に,全ての入力値を一旦メモリ上に保持してから処理するようなアルゴリズムを考えたのだとしても, 2≤N≤100 という入力個数の仕様が明記されていることを考えれば,A[1000000000000]とかいうことにはならないと思うし… 本件の主題(何かコード書いたら出たエラーは何?)とは無関係な話ですので,これ以上は控えさせていただきますが,問題に取り組むならまずは問題文を読むことから始めるべきなんじゃないのかな,と.
guest

回答2

0

題意を理解しましょう。

入力の制約と形式が与えられているので、まず適当な例を考えてみます。
4
31 41 59 26

長さ N = 4 の整数列 A = { 31, 41, 59, 26 } が与えられました。
A1 と A2 の差の絶対値は | 31 - 41 | = 10。
A1 と A3 の差の絶対値は | 31 - 59 | = 28。
A1 と A4 の差の絶対値は | 31 - 26 | = 5。
A2 と A3 の差の絶対値は | 41 - 59 | = 18。
A2 と A4 の差の絶対値は | 41 - 26 | = 15。
A3 と A4 の差の絶対値は | 59 - 26 | = 33。
これらの最大値は 33。

まず、ここまでは理解できましたか?

プログラムは次のようになるはずです。

C++

1#include <iostream> 2using namespace std; 3 4int main() 5{ 6 int n, a[100]; 7 cin >> n; 8 for (int i = 0; i < n; i++) cin >> a[i]; 9 10 // 添字の異なる2要素の差の絶対値の最大値を求めるコードをここに書く 11}

プログラム中では A1 は a[0]、A2 は a[1] です。
コードを書いたら、質問に追記してください。

投稿2020/02/28 02:36

kazuma-s

総合スコア8224

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

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

0

int A[1000000000000];

桁が多すぎてわかりづらいので読みやすくするために3桁で桁区切りを行うと

c++

1int A[1'000'000'000'000];

です。

1'000'000'000'0001T(テラ)です。('毎にキロ メガ ギガと数えると楽ですね)
intは規格上最低2バイト以上なので、最低でも2TB程度が必要な事になります(大抵の環境で4バイトなので4TBでしょうね)

あまりにも大きすぎて普通のコンパイラ・OSでは対応していません。

投稿2020/02/26 08:19

asm

総合スコア15147

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

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

cunwe

2020/02/26 11:50

なるほど、確かにそんな大量の配列を確保する必要ないですね、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問