範囲内の約数でないものを求めるプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NONE

範囲内の約数でないものを求めるプログラム

#1

投稿記事 by NONE » 10年前

C言語の質問です。

現在ゲームを制作していて
そレに必要な計算の補助としてプログラムを使い始めたのですが
ちょっとかじっただけなのでよくわからなくなって困っています。
「50~69まで(あくまで例。最小値と最大値は自分で入力する)
のそれぞれ(例だと20個)の約数でないものを求め、それらを小さい順に重複しないよう表示する。
10以下、最大値の半分以上の数は表示しない」
というプログラムを書こうとしているのですが私には難しかったようです。
C言語を勉強するのが目的ではないため
コードを書いていただけるだけで十分に助かります。

以下は少し教えてもらってできた「範囲内の約数を小さい順に重複しないよう表示するプログラム」です

コード:

int main(void)
{
int i, m, n;

scanf("%d %d", &m, &n);
for(i = 1; i <= n; ++ i){
int j;
for(j = m; j < n; ++ j){
if(j % i == 0){
if(10<i){
if(i<m){
if(k != i)
printf("%d ", i);
break;
}
}
}
}
}
putchar('\n');
return 0;
}
よろしくお願いします。

box
記事: 2002
登録日時: 14年前

Re: 範囲内の約数でないものを求めるプログラム

#2

投稿記事 by box » 10年前

何かよくわからないんですけど…。
NONE さんが書きました: 「50~69まで(あくまで例。最小値と最大値は自分で入力する)
この例の場合、
NONE さんが書きました: のそれぞれ(例だと20個)の約数でないものを求め、それらを小さい順に重複しないよう表示する。
10以下、最大値の半分以上の数は表示しない」
この仕様に基づくコードを書いたとき、どういう結果がほしいのでしょうか。

できれば、他の例についても入力と出力の例を挙げてくださると助かります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

NONE

Re: 範囲内の約数でないものを求めるプログラム

#3

投稿記事 by NONE » 10年前

説明不足ですみません。
簡単なので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
が小さい順に重複しないよう出るプログラムがほしい、ということです。
わかりにくい説明で申し訳ありませんでした。

NONE

Re: 範囲内の約数でないものを求めるプログラム

#4

投稿記事 by NONE » 10年前

上の例間違えました……。
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 が出るようにしたい、です。何度もすみません。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 範囲内の約数でないものを求めるプログラム

#5

投稿記事 by みけCAT » 10年前

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 が出るようにしたい、です。何度もすみません。
15は30の約数であり、「上の数字」にも含まれているにもかかわらず、出力に含まれています。
どちらの仕様が正しいですか?
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/3JlrWU (30~32)
https://ideone.com/8MmwG1 (50~69)

標準入力の1行目に範囲の最小値、2行目に範囲の最大値を入力してください。
このプログラムでは、最小30、最大32の時、15は出力しない仕様になっています。
また、最小値および最大値はそれぞれ正であることを仮定しています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

NONE

Re: 範囲内の約数でないものを求めるプログラム

#6

投稿記事 by NONE » 10年前

丁寧にありがとうございます!
言われてよく見てみたら、たしかに15は違いました。すみません。
これで敵ステータス作成が非常に楽になるのでとても助かりました。
迅速な返答、感謝しています。

かずま

Re: 範囲内の約数でないものを求めるプログラム

#7

投稿記事 by かずま » 10年前

31 と 32 を入力すると、
10 11 12 13 14 15 になるんですよね。
それなら、

コード:

#include <stdio.h>

int main(void)
{
    int a, b, i, j, n;
    while (printf("a b ? "), scanf("%d%d", &a, &b) == 2) {
        for (n = b / 2, i = 10; i <= n; i++) {
            for (j = a; j <= b && j % i; j++) ;
            if (j > b) printf(" %d", i);
        }
        putchar('\n');
    }
    return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 範囲内の約数でないものを求めるプログラム

#8

投稿記事 by みけCAT » 10年前

かずま さんが書きました:31 と 32 を入力すると、
10 11 12 13 14 15 になるんですよね。
自分のプログラムでは11 12 13 14 15になります。
No: 1では
NONE さんが書きました:10以下、最大値の半分以上の数は表示しない
と書いてあるのに、No: 4では
NONE さんが書きました:10以上で最大値の半分未満の数字である
と書かれており、10の扱いが異なっています。
どちらの仕様が正しいのでしょうか?

【追記】No: 1のコードでは「10以下の数は表示しない」という仕様になっているようですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

NONE

Re: 範囲内の約数でないものを求めるプログラム

#9

投稿記事 by NONE » 10年前

NO.1が間違いです。10未満は表示しない、でした
とことん不正確で混乱させてしまい申し訳ありませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る