C言語の質問です。
現在ゲームを制作していて
そレに必要な計算の補助としてプログラムを使い始めたのですが
ちょっとかじっただけなのでよくわからなくなって困っています。
「50~69まで(あくまで例。最小値と最大値は自分で入力する)
のそれぞれ(例だと20個)の約数でないものを求め、それらを小さい順に重複しないよう表示する。
10以下、最大値の半分以上の数は表示しない」
というプログラムを書こうとしているのですが私には難しかったようです。
C言語を勉強するのが目的ではないため
コードを書いていただけるだけで十分に助かります。
以下は少し教えてもらってできた「範囲内の約数を小さい順に重複しないよう表示するプログラム」です
よろしくお願いします。
範囲内の約数でないものを求めるプログラム
Re: 範囲内の約数でないものを求めるプログラム
何かよくわからないんですけど…。
できれば、他の例についても入力と出力の例を挙げてくださると助かります。
この例の場合、NONE さんが書きました: 「50~69まで(あくまで例。最小値と最大値は自分で入力する)
この仕様に基づくコードを書いたとき、どういう結果がほしいのでしょうか。NONE さんが書きました: のそれぞれ(例だと20個)の約数でないものを求め、それらを小さい順に重複しないよう表示する。
10以下、最大値の半分以上の数は表示しない」
できれば、他の例についても入力と出力の例を挙げてくださると助かります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 範囲内の約数でないものを求めるプログラム
説明不足ですみません。
簡単なので20から22の例で言いますと
20の約数
1 2 4 5 10 20
21の約数
1 3 7 21
22の約数
1 2 11 22
上の数字に当てはまらない(20から22までの約数ではない)、10以上で最大値の半分未満の数字である
12 13 14 15
が小さい順に重複しないよう出るプログラムがほしい、ということです。
わかりにくい説明で申し訳ありませんでした。
簡単なので20から22の例で言いますと
20の約数
1 2 4 5 10 20
21の約数
1 3 7 21
22の約数
1 2 11 22
上の数字に当てはまらない(20から22までの約数ではない)、10以上で最大値の半分未満の数字である
12 13 14 15
が小さい順に重複しないよう出るプログラムがほしい、ということです。
わかりにくい説明で申し訳ありませんでした。
Re: 範囲内の約数でないものを求めるプログラム
上の例間違えました……。
30 と 32 を入力して
30の約数 1 2 3 5 6 10 15 30
31の約数 1 31
32の約数 1 2 4 8 16 32
上の数字に当てはまらない(30から32までの約数ではない)、10以上で最大値の半分未満の数字である
11 12 13 14 15 が出るようにしたい、です。何度もすみません。
30 と 32 を入力して
30の約数 1 2 3 5 6 10 15 30
31の約数 1 31
32の約数 1 2 4 8 16 32
上の数字に当てはまらない(30から32までの約数ではない)、10以上で最大値の半分未満の数字である
11 12 13 14 15 が出るようにしたい、です。何度もすみません。
Re: 範囲内の約数でないものを求めるプログラム
15は30の約数であり、「上の数字」にも含まれているにもかかわらず、出力に含まれています。NONE さんが書きました:上の例間違えました……。
30 と 32 を入力して
30の約数 1 2 3 5 6 10 15 30
31の約数 1 31
32の約数 1 2 4 8 16 32
上の数字に当てはまらない(30から32までの約数ではない)、10以上で最大値の半分未満の数字である
11 12 13 14 15 が出るようにしたい、です。何度もすみません。
どちらの仕様が正しいですか?
すなわち、とりあえず「計算するプログラム」があればいいということですか?NONE さんが書きました:現在ゲームを制作していて
そレに必要な計算の補助としてプログラムを使い始めたのですが
ちょっとかじっただけなのでよくわからなくなって困っています。
(中略)
C言語を勉強するのが目的ではないため
コードを書いていただけるだけで十分に助かります。
-- valがminVal以上maxVal以下の整数の約数ならTrue、そうでないならFalseを返す
isNotYakusu:: Integer -> Integer -> Integer -> Bool
isNotYakusu minVal maxVal val = null $ filter (\a -> (mod a val) == 0) [minVal .. maxVal]
-- 条件に当てはまる数のリストを返す
-- aが奇数ならa/2の整数部分はa未満、aが偶数ならa/2はaの約数なので、範囲に含まれていてもよい
calc:: Integer -> Integer -> [Integer]
calc minVal maxVal = filter (isNotYakusu minVal maxVal) [11 .. (div maxVal 2)]
-- リストの各要素をsepでつなげた文字列を返す
joinList:: Show a => String -> [a] -> String
joinList _ [] = ""
joinList sep (l:lst) = foldl (\s e -> s ++ sep ++ (show e)) (show l) lst
-- 入力を受け取って、計算する
main:: IO ()
main = do
minVal <- readLn
maxVal <- readLn
putStrLn $ joinList " " $ calc minVal maxVal
https://ideone.com/8MmwG1 (50~69)
標準入力の1行目に範囲の最小値、2行目に範囲の最大値を入力してください。
このプログラムでは、最小30、最大32の時、15は出力しない仕様になっています。
また、最小値および最大値はそれぞれ正であることを仮定しています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 範囲内の約数でないものを求めるプログラム
丁寧にありがとうございます!
言われてよく見てみたら、たしかに15は違いました。すみません。
これで敵ステータス作成が非常に楽になるのでとても助かりました。
迅速な返答、感謝しています。
言われてよく見てみたら、たしかに15は違いました。すみません。
これで敵ステータス作成が非常に楽になるのでとても助かりました。
迅速な返答、感謝しています。
Re: 範囲内の約数でないものを求めるプログラム
自分のプログラムでは11 12 13 14 15になります。かずま さんが書きました:31 と 32 を入力すると、
10 11 12 13 14 15 になるんですよね。
No: 1では
と書いてあるのに、No: 4ではNONE さんが書きました:10以下、最大値の半分以上の数は表示しない
と書かれており、10の扱いが異なっています。NONE さんが書きました:10以上で最大値の半分未満の数字である
どちらの仕様が正しいのでしょうか?
【追記】No: 1のコードでは「10以下の数は表示しない」という仕様になっているようですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)