プロが教えるわが家の防犯対策術!

画像のような問題があるのですが、
void lcg(?)
{
???
}
ここまでしかわかりません。
わかる方お願いします。

「画像のような問題があるのですが、 voi」の質問画像

A 回答 (2件)

> void lcg(int *x)



返り値はintなんで、voidじゃないです。returnを使う限り、voidは使えません。
あと、何故にポインタを使おうとしたのか、も分かりません。
単純にint xで良いですよ。

> int main(void){
>
>int nmax=100;
>int x=190004;
>for (n=1;n<nmax;n++){
>lcg(&x);
>}
>printf("%d\n",x);
>
>return 0;
>}

何故にforループしなきゃなんない、って思ったのか知りませんが、必要ないです。
例えば、

int main(void) {
 printf("%d\n", lcg(190004, なんか適当な初期値));
 return 0;
}

でオシマイ、です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2020/11/21 17:17

うーん、こういうのって数列の初期値が無いと解けないんじゃないの?



まあ、それはさておき。
実はこのテの問題って一番カンタンな問題なんですよ。なんせ「言われた通りにプログラムすれば良い」。コツは「何も考えない事」です。いやマジで。
初見じゃビビるかもしれませんが、ハッキリ言ってハナクソです。
初期値が不明だけど、まぁやっていきましょうか。

まずプログラムを組みやすいようにちょっとだけ漸化式を弄ります。
次のように書き換えます。

x_{n+1} = [(53 * x_{n} + 29) mod 65536] => x_{n} = [(53 * x_{n-1} + 29) mod 65536]

添字を一個ズラシただけ、ですね。(n = 0, 1, ...)ってのは変わりません。
さて。

1. x_{n} =... を書く

int x(int n) { ...

で書き始めます。ただ、今回の場合、初期値が不明なんで、外部から与えるカタチにします。x_{n}は正の整数なんで、まぁ、エラーチェックを除くと、x_{n}はintだし、当然初期値x_{0}もintなんで、引数としてint iniってのを与えるようにしてみます。

int x(int n, int ini) {...

で書き始めます。

2. 初期値を書く

初期値はn = 0の時のx_{n}の値なのはいいですね。それが返るようにプログラムします。

int x(int n, int ini) {
 if (n == 0) {
  return ini;
 } ...

プログラミング用語ではこういう初期値、ないしは初期条件を特に「終了条件」と言いますが、高校数学的なヤツでは単に数列の最初の値です。

3. [(53 * x_{n-1} + 29) mod 65536] を書く。

残りはホンマハナクソです。そのまま書けば良い。

int x(int n, int ini) {
 if (n == 0) {
  return ini;
 } else {
  return ((53 * x(n-1, ini) + 29) % 65536);
 }
}

xの内部でxを呼び出してますが、これで良いです。「言われた通りにプログラム」したんで、完成です。あとは、こいつをmain関数から引数2つつけて呼び出せば良い。

ちなみに、もうちょっとプログラミングに慣れると、次のように書いても良い、って事が分かるでしょう。

/* 別解 */

int x(int n, int acc) {
 if (n == 0) {
  return acc;
 } else {
  return x(n-1, ((53 * acc) + 29) % 65536);
 }
}

二引数なのは変わりませんが、全計算を引数内で行う、と言う方法へと変えています(コンパイラに依りますが、こっちの方がコンパイラの「最適化」オプションで、より効率の良い実行形式を吐き出します)。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

void lcg(int *x)
{
if (n == 0) {
return ini;
} else{
return ((53 * x(n-1,ini)+29) %65536);
}
}

int main(void){

int nmax=100;
int x=190004;
for (n=1;n<nmax;n++){
lcg(&x);
}
printf("%d\n",x);

return 0;
}
こんな感じになったのですが、エラーがでてしまいます。

お礼日時:2020/11/21 17:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!