如何删除范围内以逗号分隔的素数中的最后一个逗号?

How to remove the last comma in comma separated prime numbers within a range?

我有在一定范围内查找素数的代码。

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

#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

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

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

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

  }

使用标志检测 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,

您可以直接决定要在数字之间打印什么而不是标记

请注意,一旦 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');
}

简单地说,您需要下面给出的最小循环的奇数最佳实践;

#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

将结果存储到缓冲区中,完成后打印缓冲区:

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

此示例使用简单的固定大小缓冲区,如果这不符合您的需要,请将其替换为动态缓冲区。

这更像是一个 "language-agnostic" 问题:"How do I output a comma-separated list without a final comma?" 它不是专门针对素数的。

您似乎在考虑将您列为一系列 [prime comma] 单元。它不是。更好的理解方式是将单个 prime 作为列表的头部,然后是重复的 [comma prime] 单元的尾部。

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

outputList(theList)
  separator = ", "
  output(theList.firstItem())
  while (theList.hasMoreItems())
    output(separator)
    output(theList.nextItem())
  endwhile
return
/*  this is just logic */

    for(i=2;i<=n;i++)
    {
        k=0;
        for(j=2;j<=i/2;j++)
        {
            if(i%j==0)
                k=1;
        }
        if(k==0)
        {
            c++;
            c++;
        }

    }

     System.out.println(c);
     for(i=2;i<=n;i++)
        {
            k=0;
            for(j=2;j<=i/2;j++)
            {
                if(i%j==0)
                    k=1;
            }
            if(k==0)
            {
                System.out.print(i);
                b++;
                if(b!=c-1)
                    {
                    System.out.print(",");
                    b++;
                }
            }

        }

    }

}
//comma separated values


#include <bits/stdc++.h>
using namespace std;

int Prime(int a, int n){
    bool prime[n+1];
    memset(prime,true,sizeof(prime));
    for(int p=2;p*p<=n;p++){
        if(prime[p]==true){
            for(int i=p*p ; i<=n; i+=p ){
                prime[i] = false;
            }
        }
    }

    for(int i = 2;i<= n;i++){
        if(i==2) cout<<i;    // here is the logic  first print 2 then for other numbers first print the comma then the values 
        else if(prime[i]) cout<<","<<i;
    }

}
int main(){
    int a =2 ;
     int n = 30; 
     Prime(a , n);

}
#include <stdio.h>

int main()
{
    int i, j, n, count;
    scanf("%d", &n);

    for(i=2; i<n; i++) 
    {
        count=0;
        for(j=2; j<n; j++)
        {
            if(i%j==0) 
             count++;
        }
        if(count==1)
          printf("%d," i);

    }
    printf("\b \b");        
}

\b是无损回退space。它向后移动光标,但不会删除那里的内容,而是替换它。对于一个破坏性的背部space, 使用 "\b \b" 即一个 backspace、一个 space 和另一个 backspace.

此程序打印给定数字以内的所有质数,以逗号分隔