2017-09-16 3 views
-4

J'ai le code pour trouver des nombres premiers dans une plage.Comment supprimer la dernière virgule en nombres premiers séparés par des virgules dans un intervalle?

Le problème consiste à supprimer la dernière virgule.

#include<stdio.h> 

int main() 
{ 
    int a,b,i,x,c,f=1; 
    scanf("%d%d",&a,&b); 
    for(x=a;x<=b;(x++,f=0)) 
    { 

     for(i=2;i<x;i++) 
     { 
      if(x%i==0) 
      { 
       f=1; 
      } 
     } 

     if(f==0) 
      printf("%d,",x); 
    } 
    } 

Mais la sortie contient une virgule supplémentaire dans la dernière. Par exemple

2,3,5,7,

alors que le résultat attendu est

2,3,5,7

+5

Il suffit de ne pas imprimer? Ensuite, il n'y aurait pas besoin de l'enlever. – alk

+3

Imprime '" 2 "' (ou selon le premier de ces termes), puis imprime '",% d "' pour chaque premier suivant. – Yunnosch

+0

C'est la sortie désirée. –

Répondre

1
#include<stdio.h> 

int main() 
{ 
    int a,b,i,x,c,f=1; 
    char backspace = 8; 

    scanf("%d%d",&a,&b); 
    for(x=a;x<=b;(x++,f=0)) 
    { 

     for(i=2;i<x;i++) 
     { 
      if(x%i==0) 
      { 
       f=1; 
      } 

     } 
     if(f==0) 
      printf("%d,",x); 
    } 
    printf("\b"); // or printf("%c", backspace); 
    } 
+0

Cela ne fonctionne pas sur mon [ATS] (https://en.wikipedia.org/wiki/Teleprinter)! ;-) – alk

1

Ajoutez un autre drapeau, juste un simple compteur qui vous indique si vous imprimez la première fois puis vérifiez le drapeau pour décider quoi imprimer, par ex.

#include<stdio.h> 

    int main() 
    { 
     int a,b,i,x,c,first=0,f=1; 
     scanf("%d%d",&a,&b); 
     for(x=a;x<=b;(x++,f=0)) 
     { 

      for(i=2;i<x;i++) 
      { 
       if(x%i==0) 
       { 
        f=1; 
       } 
      } 

      if(f==0) 
       { 
        if(first==0){ 
         printf("%d",x); 
        }else{ 
         printf(",%d",x); 
        } 
        first++ 
       } 
     } 

    } 
1

Utilisez un drapeau pour détecter la première occurrence de printf() et imprimer le premier numéro en tant que tel sans ,. Pour l'impression des numéros consécutifs précèdent avec ,

#include<stdio.h> 

int main() 
{ 
    int a,b,i,x,c,f=1,flag=0;//Flag to mark first occurrence 
    scanf("%d%d",&a,&b); 
    for(x=a;x<=b;(x++,f=0)) 
    { 

     for(i=2;i<x;i++) 
     { 
      if(x%i==0) 
      { 
       f=1; 
       break;// Once the condition fails can break of the for loop as it fails for the prime number condition at the first case itself 
      } 

     } 
      if(f==0) 
      { 
      if(flag==0) 
      {//Check if it is first time 
       printf("%d",x); 
       flag = 1;//If so print without ',' and set the flag 
      } 
      else 
       printf(",%d",x);// On next consecutive prints it prints using ',' 
      } 
     } 
    } 

Cette méthode permet également d'éviter la , quand un seul numéro est imprimé.

Par exemple: quand l'entrée est 2 et 4. Il imprime juste 3 et non 3,

2

Au lieu de drapeau, vous pouvez décider directement ce que vous voulez imprimer entre les numéros

Et notez que vous pouvez sortir de la boucle interne dès que f est mis à 1

#include<stdio.h> 

int main() 
{ 
    int a,b,i,x,c,f=1; 
    const char* delim = ""; 
    scanf("%d%d",&a,&b); 
    for(x=a; x<=b; (x++,f=0)) 
    { 
     for(i=2; i<x; i++) 
     { 
      if(x%i==0) 
      { 
       f=1; 
       break; //no need to continue the checking 
      } 
     } 

     if(f==0) { 
      printf("%s%d",delim,x); 
      delim = ", "; 
     } 
    } 
    putchar('\n'); 
} 
+0

désolé mauvais éditer ... –

0

Vous avez simplement besoin d'une meilleure pratique de nombres impairs pour la boucle minimale;

#include<stdio.h> 
int main() 
{ 
    int a,b,i,x,c,f=1; 
    scanf("%d%d",&a,&b); 

    while (a < b) 
    { 
     if ((a%2) == 1) { 
      printf("%d", a); 
      if ((a + 1) < b && (a + 2) < b) 
       printf(","); 
     } 
     a = a + 1; 
    } 
} 

s'il vous plaît vérifier sur le site http://rextester.com/MWNVE38245

0

Stocker le résultat dans une mémoire tampon et lorsque vous avez terminé imprimer le tampon:

#include <stdio.h> 
#include <errno.h> 

#define RESULT_MAX (42) 

size_t get_primes(int * result, size_t result_size, int a, int b) 
{ 
    int i, x, f = 1; 
    size_t result_index = 0; 

    if (NULL == result) || (0 == result_size) || ((size_t) -1 == result_size)) 
    { 
     errno = EINVAL; 
     return (size_t) -1; 
    } 

    for (x = a; x <= b; (x++, f = 0)) 
    { 
     for (i = 2; i < x; i++) 
     { 
      if (x % i == 0) 
      { 
       f = 1; 
       break; 
      } 
     } 

     if (f == 0) 
     { 
      result[result_index] = x; 
      ++result_index; 
      if (result_size <= result_index) 
      { 
       fprintf(stderr, "Result buffer full. Aborting ...\n"); 
       break; 
      } 
     } 
    } 

    return result_index; 
} 

int main(void) 
{ 
    int a = 0, b = 0; 
    int result[RESULT_MAX]; 

    scanf("%d%d", &a, &b); 

    { 
     size_t result_index = get_primes(result, RESULT_MAX, a, b); 

     if ((size_t) -1 == result_index) 
     { 
      perror("get_primes() failed"); 
     } 
     else if (0 == result_index) 
     { 
      fprintf(stderr, "No primes found.\n"); 
     } 
     else 
     { 
      printf("%d", result[0]); 

      for (size_t i = 1; i < result_index; ++i) 
      { 
       printf(", %d", result[i]); 
      } 
     } 
    } 

    return 0; 
} 

Cet exemple utilise un simple tampon de taille fixe, si cette ne répond pas à vos besoins le remplacer par un dynamique.

0

Il s'agit plutôt d'un problème de "langage agnostique": "Comment afficher une liste séparée par des virgules sans virgule finale?" Ce n'est pas spécifiquement à propos des nombres premiers.

Vous semblez vous considérer comme une série de [prime comma] unités. Ce n'est pas. Une meilleure façon d'y penser est comme un seul prime en tête de la liste, suivi par une queue de [comma prime] unités répétées.

Certains pseudo-code pour illustrer l'idée générale:

outputList(theList) 
    separator = ", " 
    output(theList.firstItem()) 
    while (theList.hasMoreItems()) 
    output(separator) 
    output(theList.nextItem()) 
    endwhile 
return