zadasd_zest2/asdzes2zad1i2eratostenes_mersenne/main.c

95 lines
1.6 KiB
C
Raw Normal View History

2019-01-23 19:13:19 +01:00
#include <math.h>
#include <stdio.h>
#pragma pack(push, 1)
2019-01-23 20:33:51 +01:00
#define N (1 << 10) - 1
2019-01-23 19:13:19 +01:00
struct bool_store {
int v : 1;
};
static struct bool_store _a[N - 1];
#pragma pack(pop)
int A_bf2_get(int i)
{
if (i < 2)
return 0;
return _a[i - 2].v;
}
void A_bf2_set(int i, int b)
{
_a[i - 2].v = b;
}
#define TRUE 1
#define FALSE 0
void doSE()
{
int i;
for (i = 2; i <= N; i++)
A_bf2_set(i, 1);
for (i = 2; i <= sqrt(N); i++)
if (A_bf2_get(i)) {
int j;
for (j = i * i; j <= N; j += i)
A_bf2_set(j, FALSE);
}
}
2019-01-23 20:33:51 +01:00
void do_and_print_mersenne()
{
int p, m, j;
for (p = 2; p <= 20; p++) {
if (!A_bf2_get(p))
continue;
m = (1 << p) - 1;
for (j = 2; j <= sqrt(m); j++)
if (m % j == 0)
continue;
printf(" 2 ^ %2d - 1 = %6d \n", p, m);
}
}
2019-01-23 19:13:19 +01:00
#define FILL_CHAR '-'
void do_and_print_eratostenes()
2019-01-23 19:13:19 +01:00
{
doSE();
int i;
for (i = 0; i <= N; i++) {
if (i % 10 == 0)
putchar('\n');
putchar(' ');
if (A_bf2_get(i))
2019-01-23 20:33:51 +01:00
printf("%4d", i);
2019-01-23 19:13:19 +01:00
else {
2019-01-23 20:33:51 +01:00
if (i >= 1000)
putchar(FILL_CHAR);
else
putchar(' ');
2019-01-23 19:13:19 +01:00
if (i >= 100)
putchar(FILL_CHAR);
else
putchar(' ');
if (i >= 10)
putchar(FILL_CHAR);
else
putchar(' ');
putchar(FILL_CHAR);
}
}
putchar('\n');
}
int main()
{
do_and_print_eratostenes();
do_and_print_mersenne();
2019-01-23 19:13:19 +01:00
return 0;
}