一世轻尘 发表于 2021-1-13 00:24:44

报数问题

#include<stdio.h>
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int a={0};
    for(i=0;i<n;i++)
    {
      a=i+1;
    }
    i=0;
    int i1=1,count=n-1;
    while(count)
    {
      if(a!=0)
      {
            if(i1%3==0)
            {
                a=0;
                count--;
            }
            if(i==n-1)
            {
                i=0;
            }
            else
            {
                i++;
            }
            i1=i1+1;
            if(i1==4)
            {
                i1=1;
            }
      }
      else
      {
            if(i<n-1)
            {
                i++;
            }
            else if(i==n-1)
            {
                i=0;
            }
      }
    }
    for(i=0;i<n;i++)
    {
      if(a!=0)
      {
            printf("%d",a);
      }
    }
    return 0;
}
找个人帮我优化一下,感觉我写的好乱{:10_333:}

风过无痕1989 发表于 2021-1-13 01:23:33

这个问题我回答过,我的程序如下(不是对你的程序的优化,从今年开始,我已经不再回答花时间多的问题了,不好意思):
// 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后
// 留下的是原来第几号的那位
#include<stdio.h>
#define nmax 50
main()
{
        int i, k, m, n, num, *p;
        printf("please input the total of numbers:");
        scanf("%d", &n);
        p = num;
        for (i = 0;i < n;i++)
                *(p + i) = i + 1;
        i = 0;
        k = 0;
        m = 0;
        while (m < n - 1)
        {
                if (*(p + i) != 0)
                        k++;            // 报数号
                if (k == 3)         // 报数为3的置0出局
                {
                        *(p + i) = 0;
                        k = 0;
                        m++;            // 出局人数
                }
                i++;                  // 数组的下标
                if (i == n)
                        i = 0;            // 一轮报数完成,重新开始报数
        }
        while (*p == 0) p++;
        printf("The last one is %d\n", *p);
}

jackz007 发表于 2021-1-13 01:40:25

本帖最后由 jackz007 于 2021-1-13 02:20 编辑

#include <stdio.h>

int main(void)
{
      int d = {0} , e , i , j, n                         ;
      scanf("%d" , & n)                                       ;
      for(i = 1 ; i < n + 1 ; i ++) d = i                  ; // 用索引号为数组元素编号
      for(e = 0 , i = 1 ; n > 2 ;) {
                e ++                                              ;
                if(e == 3) {                                        // 数到 3
                        for(j = i ; j < n ; j ++) d = d ; // 数组整体向前搬家,删除数到 3 的数组元素
                        e = 0                                     ;
                        n --                                    ;
                } else {
                        i ++                                    ;
                }
                if(i > n) i = 1                                 ;
      }
      printf("%d\n" , d)                                     ; // 最后剩下 2 个元素,显示后面的那个
}
页: [1]
查看完整版本: 报数问题