数列の作成
Re: 数列の作成
この数列の一般項は分かりますか?drake さんが書きました:(1,3,5,9,20....n)のような 前の数を足し合わせた数よりおおきくなっていくような数列を作りたいのですが
どうしたら良いでしょうか?
ピンポイントな関数もサンプルコードも存在しないものだと思ってください。基本的には自分で作るものです。drake さんが書きました:どのような関数を使うかなやC言語でのどの部分を学ぶべきかやこのプログラミグソースを1度みるべきなど何かアドバイスをお願いします。
強いて言うなら数学の勉強をした方がよいと思います。
初心者です
Re: 数列の作成
https://ja.wikipedia.org/wiki/Merkle-He ... 7%E5%8F%B7
すみませんこのサイトの鍵生成の超増加数列部分を作りたいのですが困ってる状態です。
とりあえず実行するとランダムに(1,3,8.....)や(2,3,10,22....)など実行するたびに違う数列になり前の値より増えていく数列を作っていきたいのですが
それをどうして作っていっていいか分からない状態です。
ご指摘お願いしますm(_ _)m
すみませんこのサイトの鍵生成の超増加数列部分を作りたいのですが困ってる状態です。
とりあえず実行するとランダムに(1,3,8.....)や(2,3,10,22....)など実行するたびに違う数列になり前の値より増えていく数列を作っていきたいのですが
それをどうして作っていっていいか分からない状態です。
ご指摘お願いしますm(_ _)m
Re: 数列の作成
前の数(どこからどこまで?)を足し合せた数drake さんが書きました: (1,3,5,9,20....n)のような 前の数を足し合わせた数よりおおきくなっていくような数列を作りたいのですが
とりあえず実行するとランダムに(1,3,8.....)や(2,3,10,22....)など実行するたびに違う数列になり前の値より増えていく数列を作っていきたいのですが
なのか
前の値
なのか
どちらですか?
自分がやりたいことを日本語で正確に書くことができなければ、
コードに落とし込むことはまず不可能です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 数列の作成
「数列」「シグマ(Σ)」は履修されていますか。drake さんが書きました:誰かアドバイスよろしくお願いします。。。
高校数学で学ぶはず(高2かな?)ですが。
履修しているのであればYuOさんのレスで、プログラム(C言語)に落とせるはずです。
履修していないのであればその旨書きましょう(Σってなんでしょうか?とかね)。
それとも、C言語でプログラムに落とせないのでしょうか。
C言語で「Hello, World」と出力する簡単なプログラムは組めますか。
組めないのであれば、まずはC言語を学ぶことですね。
組めるのであれば、まずは途中でもいいので、あなたが作成したコードを掲示してください。
written by へにっくす
Re: 数列の作成
これをC言語で書き直せばよいでしょう。drake さんが書きました:誰かアドバイスよろしくお願いします。。。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 数列の作成
たくさんのご指摘ありがとうございます。
数列は自分のうちまちがいです。すいません正しくは(1,3,6,12,33....)などのような感じです。
とりあえずHello worldは作れます。只おっしゃて頂いたΣの計算をC言語どうかけばいいか分からない状態です。
なのでとりあえず超増加数列では単純に1 2 3 4と普通にあがっていく数列を作ったのですがそれもうまくいかない状態のレベルです。
ここからどうアレンジしてばいいのか分からない状態でありrandの出す整数をどう加えるのかなど分からない状態です。ご指摘お願いします。
この結果が10だけになります。自分の頭ではxは1からはじまり10以下になるまで1ずつ増えていくと思ってるのですがなぜか数列が作れないです。
数列は自分のうちまちがいです。すいません正しくは(1,3,6,12,33....)などのような感じです。
とりあえずHello worldは作れます。只おっしゃて頂いたΣの計算をC言語どうかけばいいか分からない状態です。
なのでとりあえず超増加数列では単純に1 2 3 4と普通にあがっていく数列を作ったのですがそれもうまくいかない状態のレベルです。
ここからどうアレンジしてばいいのか分からない状態でありrandの出す整数をどう加えるのかなど分からない状態です。ご指摘お願いします。
この結果が10だけになります。自分の頭ではxは1からはじまり10以下になるまで1ずつ増えていくと思ってるのですがなぜか数列が作れないです。
Re: 数列の作成
xは(最適化されなければ)まず1に初期化され、10以上になるまで(「10以下になるまで」は誤り)1ずつ増えていきます。
そして、最終結果の10がprintfにより出力されます。
増えていく過程を表示するには、for文の行の最後から2文字目のセミコロンが邪魔ですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 数列の作成
普通に書けばいいです。drake さんが書きました:只おっしゃて頂いたΣの計算をC言語どうかけばいいか分からない状態です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
int R(void)
{
return rand() % 10 + 1;
}
int main(void)
{
int A[MAX + 1];
int i, N;
srand((unsigned int)time(NULL));
/* A1 = R */
A[1] = R();
for (N = 2; N <= MAX; N++)
{
/* AN = Σ_{i=1}^{N-1}Ai+R */
A[N] = 0;
for (i = 1; i <= N - 1; i++) A[N] += A[i];
A[N] += R();
}
/* 生成した数列を出力する */
printf("%d", A[1]);
for (i = 2; i <= MAX; i++) printf(",%d", A[i]);
putchar('\n');
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 数列の作成
ついでに、配列を使わず計算量も少ないバージョンも置いておきます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 10
int get_rand(void)
{
return rand() % 10 + 1;
}
int main(void)
{
int i, sum;
srand((unsigned int)time(NULL));
sum = 0; /* これまでの合計 */
for (i = 0; i < NUM; i++)
{
/* 数列の次の要素を作成する */
int next_value = sum + get_rand();
/* 作成した要素を出力する */
if (i > 0) putchar(',');
printf("%d", next_value);
/* 作成した要素をこれまでの合計に加える */
sum += next_value;
}
putchar('\n');
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 数列の作成
ご回答ありがとうございます!とりあえずこぴぺして実行したら数列を作る事ができました。ただどうしてこうなるのか理解したいのですが
自分で調べて分からない所を教えて頂きたいです。
#define NUM 10
int get_rand(void)
{
return rand() % 10 + 1;
}
自分の見解をかくのでどこの理解が間違っているか教えてほしいです。
#define NUM 10→10個のNUMという変数をいれる場所いれる場所を宣言しているのでしょうか?
return rand() % 10 + 1;→ rand() % 10 + 1は1~10のランダムな乱数を作るだと思うのですがreturnをつけるとどうなるのでしょうか?また1~10の乱数を作るのになぜ実行すると10以上の乱数が足されているのでしょうか?
for (i = 0; i < NUM; i++)→iがNUMより小さいときiは一ずつ増えていくだと思うのですがこの場合はNUMは何でどの部分をさしているのでしょうか?
printf("%d", next_value);と
sum += next_value;→このnext_valueが何を表しているのかわからないです。よくわからないです
説明が分かりにくいと思いますがご指摘お願いします。
自分で調べて分からない所を教えて頂きたいです。
#define NUM 10
int get_rand(void)
{
return rand() % 10 + 1;
}
自分の見解をかくのでどこの理解が間違っているか教えてほしいです。
#define NUM 10→10個のNUMという変数をいれる場所いれる場所を宣言しているのでしょうか?
return rand() % 10 + 1;→ rand() % 10 + 1は1~10のランダムな乱数を作るだと思うのですがreturnをつけるとどうなるのでしょうか?また1~10の乱数を作るのになぜ実行すると10以上の乱数が足されているのでしょうか?
for (i = 0; i < NUM; i++)→iがNUMより小さいときiは一ずつ増えていくだと思うのですがこの場合はNUMは何でどの部分をさしているのでしょうか?
printf("%d", next_value);と
sum += next_value;→このnext_valueが何を表しているのかわからないです。よくわからないです
説明が分かりにくいと思いますがご指摘お願いします。
Re: 数列の作成
いいえ、「ソースコードのここ以降にNUMというトークンがあったら、それを10に置換しろ」という指示をプリプロセッサに出しているだけです。drake さんが書きました:#define NUM 10→10個のNUMという変数をいれる場所いれる場所を宣言しているのでしょうか?
作られた乱数がこの関数の戻り値となり、この関数の実行を終了して呼び出し元に戻ります。drake さんが書きました: return rand() % 10 + 1;→ rand() % 10 + 1は1~10のランダムな乱数を作るだと思うのですがreturnをつけるとどうなるのでしょうか?
1~10の乱数を作るからです。10は10以上です。drake さんが書きました:また1~10の乱数を作るのになぜ実行すると10以上の乱数が足されているのでしょうか?
NUMはマクロで、「どの部分をさしている」というのはよくわからないですがプリプロセッサにより10に置き換えられているはずです。drake さんが書きました: for (i = 0; i < NUM; i++)→iがNUMより小さいときiは一ずつ増えていくだと思うのですがこの場合はNUMは何でどの部分をさしているのでしょうか?
next_valueは生成された数列の要素です。drake さんが書きました:printf("%d", next_value);と
sum += next_value;→このnext_valueが何を表しているのかわからないです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)