Code initiative – Rabat 2011

Problème D : Spirale des nombres premiers

Fichier d’entrée : spiral.in

Fichier de sortie : spiral.out (IN+OUT)

Source : spiral.c | spiral.cpp | spiral.java | spiral.cs | spiral.php

Le spiral des nombres premiers a été modélisé premièrement en 1963 par le mathématicien Américo-polonais  Stanislaw Ulman durant une réunion ennuyeuse J

La spirale dont on parlera aujourd’hui est une spirale de dimension N * N avec N un entier impaire entre 3 et 99 (compris). Cette spirale commence par 1 et parcoure les nombre jusqu’à N*N selon les schémas suivants (cas de N=3 et N=5)

Votre mission est de trouver pour N donné la somme maximale des nombres premiers dans un diagonal.

Pout N=3 on obtient 10 = 3 + 7 , pour N=5 on obtient 49=19+7+23.

Format d’entrée

Votre programme va être testé par plusieurs cas de tests, chaque cas de test est décrit par une seule ligne contenant un entier N impaire entre 3 et 99.

Format de sortie

Pour chaque cas de test, imprimer une seule ligne contenant la somme maximale trouvée.

Exemple de fichiers entrée/sortie :

spiral.in spiral.out
5

3

49

10

Je partage avec :
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • email
  • Add to favorites
  • Google Buzz
  • LinkedIn
  • Live
  • MySpace
  • Netvibes
  • Orkut
  • Posterous
  • Reddit
Categories: Coding challenge

3 Responses so far.

  1. Zakaria dit :

    la ligne 40 de in/out(test case=81)
    quelle est la réponse pour celle la svp

  2. Mohamed Amine MOUSSAID dit :

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    import java.util.Scanner;

    /**
    *
    * @author MOAMMOUS
    */

    public class Spiral {

    public static boolean isPrime(int n) {
    if (n <= 1) {
    return false;
    }
    if (n == 2) {
    return true;
    }
    for (int i = 2; i =i&&j>N-1-i)
    {
    indexes[0] = i – 1;
    indexes[1] = j;
    }
    if(j=N-1-i)
    {
    indexes[0] = i;
    indexes[1] = j + 1;
    }
    if(j<=i&&ji&&j<=N-1-i)
    {
    indexes[0] = i;
    indexes[1] = j – 1;
    }
    return indexes;
    }
    public static int[][] spiralTable(int N){
    int[][] spirTab = new int[N][N];
    int n = (N-1)/2;
    int l = 2;
    spirTab[n][n] = 1;
    for(int p = 1; p<=n; p++) {
    int i = n+p-1;
    int j = n+p;
    while(l<=(2*p+1)*(2*p+1)) {
    spirTab[i][j] = l;
    int[] tmp = Spiral.next(i, j, N);
    i = tmp[0];
    j = tmp[1];
    l++;
    }
    }
    return spirTab;
    }

    public static int bigPrimeSum(int[][] spirTab){
    int bigSum = 0;
    int N = spirTab[0].length;
    int p = 0;
    while(p<=N-1){
    int sum = 0;
    for (int i = p; i bigSum)
    bigSum = sum;
    p++;
    }
    p = 1;
    while(p<=N-1){
    int sum = 0;
    for (int i = p; i bigSum)
    bigSum = sum;
    p++;
    }
    p = N-1;
    while(p>=0){
    int sum = 0;
    for (int i = p; i >= 0; i–) {
    if(Spiral.isPrime(spirTab[p-i][i]))
    sum+=spirTab[p-i][i];
    }
    if(sum>bigSum)
    bigSum = sum;
    p–;
    }
    p = N-2;
    while(p>=0){
    int sum = 0;
    for (int i = p; i >= 0; i–) {
    if(Spiral.isPrime(spirTab[i][p-i]))
    sum+=spirTab[i][p-i];
    }

    if(sum>bigSum)
    bigSum = sum;
    p–;
    }
    return bigSum;
    }

    public static void main(String[] args) throws FileNotFoundException {
    Scanner in = new Scanner(new File(« ./spiral.in »));
    PrintWriter out = new PrintWriter(« ./spiral.out »);
    while(in.hasNext())
    {
    out.print(Spiral.bigPrimeSum(Spiral.spiralTable(in.nextInt())));
    if(in.hasNext())
    out.println();
    else
    break;
    }
    in.close();
    out.close();
    }
    }

  3. Driss Kahfy dit :

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    import java.util.Scanner;

    public class spiral{
    private static boolean test(int number){
    int[] nombrepremier=new int[100];
    int x=0, nombre=3 , p=0 , m=0;
    boolean estpremier=true;
    nombrepremier[p]=2;
    while(nombre<=number){
    for(m=0 ; m<=p ; m++){
    if((nombre%nombrepremier[m])==0)
    {
    estpremier=false;
    break;
    }
    }
    if(estpremier){
    p++;
    nombrepremier[p]=nombre;
    }
    else if(!estpremier && nombre!=number)
    estpremier=true;
    nombre++;
    }
    return estpremier;
    }

    public static void main(String[] args) throws FileNotFoundException{
    Scanner in=new Scanner(new File("spiral.in"));
    PrintWriter out=new PrintWriter("spiral.out");
    while(in.hasNextInt()){
    int n=in.nextInt();
    int b=0 , k=1 , i=0 , j=0;
    int[][] matrice=new int[99][99];
    //Déterminer la matrice spirale.
    matrice[k-1][k-1]=1;
    while(k=0 ; i–)
    for(j=k-1 ; j>=0 ; j–)
    matrice[i+1][j+1]=matrice[i][j];
    k+=2;
    i=k-2;
    j=k-1;
    b++;
    matrice[i][j]=b;
    while(i>0){
    i–;
    b++;
    matrice[i][j]=b;
    }
    while(j>0){
    j–;
    b++;
    matrice[i][j]=b;
    }
    while(i<k-1){
    i++;
    b++;
    matrice[i][j]=b;
    }
    while(j=0 ; j–){
    i=0;
    k=j;
    somme=0;
    while(kmax) max=somme;
    }
    for(i=1 ; i<n ; i++){
    k=i;
    j=0;
    somme=0;
    while(kmax) max=somme;
    }
    for(j=0 ; j=0){
    z=test(matrice[i][k]);
    if(z && matrice[i][k]!=1)
    somme+=matrice[i][k];
    i++; k–;
    }
    if(somme>max) max=somme;
    }
    for(i=1 ; i<n ; i++){
    k=i;
    j=n-1;
    somme=0;
    while(kmax) max=somme;
    }
    out.println(max);
    }
    in.close();
    out.close();
    }
    }