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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

942閲覧

配列が大きくなりすぎる

grape_ll

総合スコア83

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

1クリップ

投稿2020/08/16 12:03

質問内容

以下のリンクの問題を解いていたのですが,自分のやり方では配列が大きくなりすぎてしまってコンパイルが出来ない状態です.
小さくするには二次元から一次元に変えればいいのではと思ったのですが,記憶して後で使用しているのでそれもできませんでした.どのようにすれば小さい配列に落とし込むことが出来るのか教えてください.
問題

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5#define A 100000 6 7int reach[A][A] 8 9int main(void){ 10 int numdesk,numroad; 11 12 scanf("%d %d",&numdesk,&numroad); 13 14 int *height,**road; 15 16 height=(int *)malloc(sizeof(int)*numdesk); 17 18 for(int i=0;i<numdesk;i++) scanf("%d",height[i]); 19 20 road=(int **)malloc(sizeof(int *)*numroad); 21 for(int i=0;i<numroad;i++) road[i]=(int *)malloc(sizeof(int)*2); 22 23 24 for(int i=0;i<A;i++){ 25 for(int j=0;j<A;j++) reach[i][j]=0; 26 } 27 int num[A]={0}; 28 29 for(int i=0;i<numroad;i++){ 30 scanf("%d %d",road[i][0],&road[i][1]); 31 reach[road[i][0]][num[road[i][0]]]=road[i][1]; 32 reach[road[i][1]][num[road[i][1]]]=road[i][0]; 33 } 34 35 int maxID[A]={0}; 36 int maxH=0; 37 int flag[A]={0}; 38 39 for(int i=0;i<numdesk;i++){ 40 int k=0; 41 maxID[i]=i+1; 42 maxH=height[i]; 43 while(reach[i][k]!=0){ 44 if(height[reach[i][k]]>maxH) { 45 maxH=height[reach[i][k]]; 46 maxID[i]=reach[i][k]; 47 } 48 k++; 49 } 50 flag[maxID[i]]=1; 51 } 52 53 int count=0; 54 55 for(int i=0;i<numdesk;i++){ 56 count+=flag[i]; 57 } 58 59 printf("%d\n",count); 60 61 62 return 0; 63}
yusuke-fusegi👍を押しています

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

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

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

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

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

cateye

2020/08/16 12:29 編集

そもそも何をしようとしていますか? 「最短経路問題」の距離を標高として考えましょう。
ttyp03

2020/08/17 00:45

そもそもreach定義行にセミコロンがついていないのですが、それを配列が大きくてエラーになっていると勘違いしていないでしょうか? まあ配列が大きくなるのは改善すべきですが。
退会済みユーザー

退会済みユーザー

2020/08/17 07:33

セミコロンを付ければコンパイル通りますね。 まあRuntime errorになりますが なぜ自分がN*N個の配列を作ろうと思ったかをよく考えなおしてみましょう この問題はN個の標高とN個の最大値の情報を持ちたいので、 N+N個の情報があれば解ける、という事が理解できているかということを問われているんですね
grape_ll

2020/08/17 11:07

reachのセミコロンを忘れていました.申し訳ございません. しかし,私の手元ではtoo largeとなってコンパイルは通りませんでした. N*Nの配列を作ろうと思ったわけは,それぞれの展望台から一回でいけるところを入力とほぼ同時に先に記録しておいて後から見てみれば,計算量を減らせるのではと考えたからです.
退会済みユーザー

退会済みユーザー

2020/08/17 12:20

確認したいんですけど、#define A 100 にしたらコンパイル通りますか? あと、解説文の 「展望台 i から一本の道を使って辿り着けるどんな展望台よりも展望台 iの方が標高が高い」ことは、 「展望台 i から一本の道を使って辿り着ける展望台の標高の最大値よりも展望台 i の標高が高い」ことと等しいです。 という文の意味は分かりますか?
grape_ll

2020/08/20 11:06

define A 100としたときにはコンパイルできました. また,日本語の意味も読み取れているつもりです.
guest

回答1

0

int型は大きい値を扱うときには不向きなので他の変数型で試してみましょう。long long型などは試してみましたか?

投稿2020/08/18 14:09

yusuke-fusegi

総合スコア39

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

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

grape_ll

2020/08/20 11:10 編集

中に入れる値が大きいのではなく,入れる個数が大きいのですが,この時にもlonglongは有効なのでしょうか?自分の知識としては入れられる整数の範囲が大きくなっただけかと思っていたのですが. ご指摘いただいた通り,longlong型でやってみましたら,vscode上ではコンパイル時にエラーが出なかったのですが,提出した後の結果ではすべてのケースでコンパイルエラーとなっていました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問