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

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

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

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

1回答

973閲覧

maxsubarray (配列の中の要素を一つずつ調べて、足していって一番大きくなるもの)

wanwanko

総合スコア14

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/12/01 10:28

編集2021/12/01 13:48

こんにちは
今、Maximum Sum arrayの問題を解いているのですが、
関数の返し方と、自分が指定した数に一番近いMaximum Sumを実装しようとしているところで詰まってします。
関数を返そうしたところで出力に問題が出てしまうのですが、自分じゃ見つけられなくて質問させていただきました。
指摘していただけたらと思います。

C

1#include <stdio.h> 2 3int sum_Function(int* nums, int i, int j){ 4 5int sum=0; 6 7for(i;i<j; i++){ 8 9 sum+=nums[i]; 10 11} 12 13return sum; 14} 15 16int maxSubArray(int* nums, int numsSize){ 17 18int max=0; 19int i=0; 20int j=numsSize; 21int temp=0; 22 23for(i=0; i<numsSize; i++){ 24 25 for(j=numsSize; j>i; j--){ 26 27 temp = sum_Function(nums,i,j); 28 29 if(max<temp){ 30 31 max=temp; 32 } 33 34 } 35 36} 37return max; 38} 39 40int main(){ 41 42 int n; 43 scanf("%d",&n); 44 int nums[n]; 45 for(int i=0;i<n;++i){ 46 scanf("%d",&nums[i]); 47 } 48 49 n = sizeof(nums) / sizeof(int); 50 51 int max = maxSubArray(nums,n); 52 printf("%d",max); 53 return 0; 54} 55コード

Ex:入力したい値
10 55 //10個の数を入力して(最大要素数は20個)、55に一番近い合計を返す。(55は超えたらいけない
2 9 6 7 8 3 4 5 10 2//大きさ10の配列の要素で全て正の数、負の数はなし
出力したい値
54
まだ、自分で合計の数字に一番近くする入力するコードを実装していないものです。

私が書いたコードは、配列の大きさを入力した後、その大きさ分の要素を入力したものです。
配列の大きさ分の要素を入力するところまではあっているはずです。
ただ、求めたい配列の要素の合計に一番近い値を出入力するところが思いつきません

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

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

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

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

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

y_waiwai

2021/12/01 10:38

提示のコードはどういう動作をしていて、どういう問題があるんでしょうか。 そして、どういう出力にしたいという話でしょうか
dodox86

2021/12/01 10:41

> 今、Maximum Sum arrayの問題を解いているのですが、 唐突に「Maximum Sum arrayの問題」と書かれても、読んだ者には???だと思いますよ。 どこかの競技プログラミング系の問題だと思いますが、そのリンクを示しましょう。 また、当該問題の解法自体が思いつかないのか、解法は思いついているけどコードが正しいかどうか分からないのか、それも読んだ者に分からないので、もう少しちゃんと説明しましょう。
BeatStar

2021/12/01 10:51

問題文があるページを張った方がいいですよ。質問者さんにとっては当たり前でも他のユーザからは当たり前ではありません。最悪でも「AtCoder」なのかなんなのかぐらいは書きましょう。 それと、プログラミングするなら『デバッグ』ぐらいはしましょう。プログラミングは「書いて終わり」…ではありません。デバッグと呼ばれる、エラーに対処することも含まれます。当たり前の技術です。
BeatStar

2021/12/01 11:08

繰り返します!!! 問題文があるページを張った方がいいですよ。質問者さんにとっては当たり前でも他のユーザからは当たり前ではありません。最悪でも「AtCoder」なのかなんなのかぐらいは書きましょう。 それと、プログラミングするなら『デバッグ』ぐらいはしましょう。プログラミングは「書いて終わり」…ではありません。デバッグと呼ばれる、エラーに対処することも含まれます。当たり前の技術です。
BeatStar

2021/12/01 11:10

それと、タグが滅茶苦茶。「標準入力」とかはまだわからんでもないけど、「関数型プログラミング」は明らかに関係ない。 質問者さんは『パン』とついているのだから、フライパンも同じだろ。と考えるお人なのでしょうか。それなら構いません。(いや、良くないけど) 関数型プログラミングは関数とはまったく関係がありません。(少しは被るが殆ど関係ない) 実際にWikipediaなりで調べてみてください。
episteme

2021/12/01 11:25 編集

一番近いって...超えてもいいの?
kazuma-s

2021/12/01 11:44

> 配列の大きさ分の要素を入力するところまではあっているはずです。 nums[0] に 55 が入るので合っていません。 > n = sizeof(nums) / sizeof(int); 10 だった n の値が 100 になってしまいます。
kazuma-s

2021/12/01 13:13

質問の入力例は 10個の数がすべて正ですが、負の数が入る場合もあるのでしょうか?
dodox86

2021/12/01 13:19

本欄の皆さんの指摘が伝わっていないのだと思いますが、例えば10個の数値が入力として与えられた時、先頭から順番に、とは限らないのですよ。最適な任意の個数の数値の組み合わせかもしれない。個数の上限があるかもしれない。それは問題を読まないと判断できません。そういったことは考えなくて良い質問なのでしょうか。
dodox86

2021/12/01 13:39

「個数の上限」とは問題で与えられる入力データの個数の最大数を言っています。組み合わせを考える場合、現実的な時間でプログラムが終わる値が指定されたりします。100個の数値が与えられる様な時、、とんでもない時間がかかる場合があります。
jimbe

2021/12/01 18:00 編集

ナップザックのように見えますが・・・まぁ、 https://en.wikipedia.org/wiki/Maximum_subarray_problem でしょうね。これに上限を追加すると。 ただ > 関数を返そうしたところで出力に問題が出てしまう が何を言っているのかが分かりません。 関数を返している所は無さそうですし、出力に問題とは? > ~あっているはずです 「はず」という希望では無く、maxSubArray を呼ぶ直前で nums や n が想定通りの値となっているかを確認してください。 そもそもご提示のコードで上限値を取り込もうとした形跡もありませんし、余計なコードで動作不良を起こしているようですので、まずはそれらをしっかり直されるのが良いかと思います。
guest

回答1

0

超えてはいけない制限値を追加するだけですよね。

diff

1-int maxSubArray(int* nums, int numsSize){ 2+int maxSubArray(int* nums, int numsSize, int limit){ 3 4- if(max<temp){ 5+ if(temp <= limit && max<temp){ 6 7- int n; 8- scanf("%d",&n); 9- int nums[n]; 10+ int n, limit; 11+ scanf("%d%d",&n,&limit); 12+ int nums[n]; // ★ int の前の全角スペースを半角に 13 14- n = sizeof(nums) / sizeof(int); 15+ //n = sizeof(nums) / sizeof(int); 16 17- int max = maxSubArray(nums,n); 18- printf("%d",max); 19+ int max = maxSubArray(nums,n,limit); 20+ printf("%d\n",max); 21 22-コード 23+//コード

上の修正で動くはずですが、2重の forループの中で maxSubArray を呼出し
その中でまた forループがあるという 3重ループで非効率です。
i以上 j未満の和が分かっていたら、i以上 (j+1)未満の和は、再計算せず、
i以上 j未満の和に nums[j] を足すだけで求まります。
負の数がないのなら、制限値を超えた場合の判定がもっと早くできます。

投稿2021/12/08 02:32

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問