Пример #1
0
int main (int argc, char* argv[]) {
    int i = 0;

    if (argc < 2) {
        printf ("missing length\n");
        exit (1);
    }

    len = atoi(argv[1]);
    sieve = (unsigned char *) malloc (sizeof (unsigned char) * len);
    memset(sieve, PRIME, len);

    sieve[0] = 1;
    sieve[1] = 1;
    fill_sieve(2, len, len-2);

    //print_prime();
    free (sieve);
    printf ("length: %d\n", len);
    return 0;
}
Пример #2
0
int main (int argc, char **argv)
{
  if (argc!=2)
    {
      fprintf (stderr, "Usage: ./sieve <n>\ncalcule et affiche les nombres premiers inferieurs a <n>.\n");
      fflush (stderr);
      exit (10); /* non mais! */
    }
  {
    int n;
    int *bits;

    n = atoi (argv[1]); // conversion chaine -> entier.
    if (n<2)
      {
	fprintf (stderr, "Ah non, quand meme, un nombre >=2, s'il-vous-plait...\n");
	fflush (stderr);
	exit (10);
      }
    bits = malloc (8*n); // allouer de la place pour n entiers (booleens).
    // Ca prend 32 fois trop de place.  Mais C-- n'a pas les operations &, |,
    // qui nous permettraient de manipuler des bits individuellement...
    if (bits==NULL)
      {
	fprintf (stderr, "%d est trop gros, je n'ai pas assez de place memoire...\n");
	fflush (stderr);
	exit (10);
      }
    zero_sieve (bits, n);
    bits[0] = bits[1] = 1;
    fill_sieve (bits, n);
    print_sieve (bits, n);
    free (bits); // et on libere la place memoire allouee pour bits[].
  }
  return 0;
}
Пример #3
0
main()
{
	char *sieve;
	int* prime_list;
	int pc = 0;
	int start = 100;
	int end = 1000;
	int i, j, k;
	int pri;
	int dig = 3;
	char prim[256];
	char patt[256];
	int len;
	int mc;
	int fm;
	int mr = 0;
	int maxmatch;
	int minmatch;
	int mixed;
	int dc = 1;
	sieve = malloc(2000000);
	int start_offs[10];

	populate();

	for (i = 0; i < 256; ++i) {
		patt[i] = 0;
		if (i < 10)
			start_offs[i] = 0;
	}

	prime_list = malloc(2000000 * sizeof(int));

	if (!sieve) {
		printf("malloc fail\n");
		exit(1);
	}

	fill_sieve(sieve, 2000000);

	for (i = 0; i < 2000000; ++i) {
		if (sieve[i]) {
			prime_list[pc++] = i;
			if (i > maxnum[dc]) {
				dc++;
				printf("%d is the first %d-digit prime\n", i, dc);
				start_offs[dc] = pc - 1;
			}
		}
	}

	printf("----------\n");

	++*patt;
	while (patt[7] == 0) {
		for (i = 0; i <= 7; ++i) {
			if (patt[i] > 11) {
				patt[i] = 1;
				++patt[i+1];
				if (patt[i+1] == 1)
					patt[i+1] = 2;
			}
		}

		if (*patt < 11 && *patt % 2 == 1)
			++*patt;
		if (*patt < 11 && *patt - 1 == 5)
			++*patt;

		len = 0;
		mixed = 0;
		for (i = 0; i <= 7; ++i) {
			if (patt[i] != 0)
				++len;
			if (patt[i] == 11)
				mixed = 1;
		}

		if (len && mixed) {
			mc = 0;
			fm = -1;
			maxmatch = biggest_match(patt, len);
			minmatch = smallest_match(patt, len);

			if (minmatch < minnum[len])
				minmatch = minnum[len];

			for (pri = start_offs[len]; pri < start_offs[len + 1]; ++pri) {
				if (prime_list[pri] > minmatch) {
					--pri;
					break;
				}
			}

			for (i = pri; prime_list[i] <= maxmatch; ++i) {
				if (match(patt, prime_list[i], len)) {
					if (fm == -1)
						fm = prime_list[i];
					++mc;
				}
			}
			if (mc && mc > mr) {
				mr = mc;
				printf("%d: %d matches ", fm, mc);
			
				if (mc == 8) {
					printf("\nThe matches are: ");
					print_matches(patt, sieve, len);
					printf("\n");
					printf("The pattern is: ");
					print_patt(patt, len);
					printf("\n");
					goto done;
				}
				printf("\n");
			}
		}
	
		++*patt;
	}		
		
	done:
	free(sieve);
}