2017-09-16 190 views
-4

我有用于查找范围内的素数的代码。如何删除逗号分隔的一个范围内的最后一个逗号?

问题是要删除最后一个逗号。

#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); 
    } 
    } 

但是输出最后包含一个额外的逗号。 例如

2,3,5,7,

而期望输出是

2,3,5,7

+5

只是不要打印?那么就不需要删除它。 – alk

+3

打印'“2”'(或以先到者为准),然后为每个后面的素数打印'“,%d”'。 – Yunnosch

+0

这就是所需的输出。 –

回答

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

这对我的[TTY](https://en.wikipedia.org/wiki/Teleprinter)无效! ;-) – alk

1

添加另一个标志,只是一个简单的计数器,告诉你是否第一次打印,然后检查该标志决定要打印什么,例如

#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

使用标志来检测的printf()的第一次出现,并打印所述第一数目为这样没有任何,。连续号码印刷之前加上,

#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 ',' 
      } 
     } 
    } 

这种方法还避免了,当打印只有一个号码。

例如:当输入为2和4。它打印只是3而不是3,

2

相反标志,你可以直接将需要数

之间打印

,请注意您可以摆脱什么决定一旦f设置为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

抱歉错误编辑... –

0

只需要奇数的最佳实践,以获得最小回路如下;

#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; 
    } 
} 

请从网站 http://rextester.com/MWNVE38245

0

商店检查的结果,到缓冲区中,当进行打印缓冲区:

#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; 
} 

此示例使用一个简单的固定大小的缓冲区,如果这不适合你的需求用动态的替代它。

0

这更像是一个“语言不可知”的问题:“如何输出逗号分隔的列表而没有最终的逗号?”它不是专门针对素数的。

你似乎在想你的名单作为一系列[prime comma]单位。事实并非如此。一个更好的方式是将其作为一个单独的prime作为列表的头部,然后是重复的[comma prime]个单元的尾部。

一些伪代码来说明的总体思路:

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