【问题标题】:How to remove the last comma in comma separated prime numbers within a range?如何删除范围内逗号分隔的素数中的最后一个逗号?
【发布时间】:2017-09-16 11:44:17
【问题描述】:

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

问题是去掉最后一个逗号。

#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

【问题讨论】:

  • 只是不打印?那么就没有必要删除它了。
  • 打印"2"(或以先到者为准),然后为后面的每个素数打印",%d"
  • 这是想要的输出。
  • 为什么不呢?只打印你找到的第一个不带逗号的,其他的都在逗号之后。
  • 当然,如果数字不是质数,那将是一个完全不同的问题。

标签: c loops primes


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    #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);
      }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          下面给出了最小循环的奇数最佳实践;

          #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

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

              这更像是一个“与语言无关”的问题:“我如何输出一个没有最后逗号的逗号分隔列表?”它不是专门关于素数的。

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

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

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

              【讨论】:

                【解决方案8】:
                /*  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++;
                                }
                            }
                
                        }
                
                    }
                
                }
                

                【讨论】:

                  【解决方案9】:
                  //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);
                  
                  }
                  

                  【讨论】:

                    【解决方案10】:
                    #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 是一个非破坏性的退格键。它向后移动光标,但不会删除那里的内容,而是替换它。对于一个破坏性的退格, 使用“\b \b”,即一个退格、一个空格和另一个退格。

                    这个程序打印所有素数直到给定的数字,用逗号分隔

                    【讨论】:

                    • 这是一道 C 题。不是 C++ 的。
                    • 是的,但逻辑保持不变请将 c++ 关键字更改为 c 供您参考
                    猜你喜欢
                    • 1970-01-01
                    • 2012-12-03
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-03-19
                    • 1970-01-01
                    • 2023-03-29
                    • 1970-01-01
                    相关资源
                    最近更新 更多