[過去ログ] プログラミングのお題スレ Part21 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
754(1): デフォルトの名無しさん [sage] 2023/06/10(土) 15:57:09.17 ID:Hla24knV(1/2) AAS
>>738738(13): デフォルトの名無しさん [] 2023/06/08(木) 22:14:54.10 ID:B/+C/EDE(2/2) AAS
お題:1234567以下の素数 a, b, c で a + b + c = 1234567 かつ a ≤ b ≤ c を満たす組み合わせは何通りあるか計算せよ。
c
・>>742742(2): デフォルトの名無しさん [] 2023/06/09(金) 20:08:26.01 ID:7Vf79qrZ(1) AAS
>>738 c
外部リンク:ideone.com
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
void sieve_of_eratosthenes(int n, int **isprime, int **primes_beg, int **primes_end) {
int i, m, j, nbytes = (1 + n) * sizeof **isprime, *map = malloc(nbytes), *beg = malloc(nbytes), *end;
for (i = 2; i <= n; i++) map[i] = 1;
for (i = 2, m = sqrt(n); i <= m; i++)
if (map[i]) for (j = i * i; j <= n; j += i) map[j] = 0;
for (i = 2, end = beg; i <= n; i++) if (map[i]) *end++ = i;
*isprime = map, *primes_beg = beg, *primes_end = end;
}
int main() {
int n = 1234567, *isprime, *primes_beg, *primes_end;
sieve_of_eratosthenes(n, &isprime, &primes_beg, &primes_end);
int *a, *b, c, count = 0;
for (a = primes_beg; a < primes_end && *a <= n / 3; a++)
for (b = a; b < primes_end && *b <= (c = n - *a - *b); b++)
if (isprime[c]) count++;
printf("count = %d\n", count);
return 0;
}
から若干の省メモリ化
判別用配列の要素をintからcharへ
素数の個数を数えてから一覧用領域を確保
・組み合わせループの条件を>>746さんを参考に改善
外部リンク:ideone.com
>>738 c
・上記からさらに省メモリ化
判別用配列はint配列だが判別はビットごと
外部リンク:ideone.com
755: 754 [sage] 2023/06/10(土) 16:17:23.88 ID:Hla24knV(2/2) AAS
>>754
誤: for (i = 2; i <= n; i++) if (at(map, i)) nprimes++;
正: for (i = 2, nprimes = 0; i <= n; i++) if (at(map, i)) nprimes++;
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.036s