鱼C论坛

 找回密码
 立即注册
查看: 966|回复: 2

[已解决]报数问题

[复制链接]
发表于 2021-1-13 00:24:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int a[100]={0};
    for(i=0;i<n;i++)
    {
        a[i]=i+1;
    }
    i=0;
    int i1=1,count=n-1;
    while(count)
    {
        if(a[i]!=0)
        {
            if(i1%3==0)
            {
                a[i]=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[i]!=0)
        {
            printf("%d",a[i]);
        }
    }
    return 0;
}
找个人帮我优化一下,感觉我写的好乱
最佳答案
2021-1-13 01:40:25
本帖最后由 jackz007 于 2021-1-13 02:20 编辑
#include <stdio.h>

int main(void)
{
        int d[200] = {0} , e , i , j  , n                         ;
        scanf("%d" , & n)                                         ;
        for(i = 1 ; i < n + 1 ; i ++) d[i] = i                    ; // 用索引号为数组元素编号
        for(e = 0 , i = 1 ; n > 2 ;) {
                e ++                                              ;
                if(e == 3) {                                        // 数到 3
                        for(j = i ; j < n ; j ++) d[j] = d[j + 1] ; // 数组整体向前搬家,删除数到 3 的数组元素
                        e = 0                                     ;
                        n --                                      ;
                } else {
                        i ++                                      ;
                }
                if(i > n) i = 1                                   ;
        } 
        printf("%d\n" , d[2])                                     ; // 最后剩下 2 个元素,显示后面的那个 
}
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-13 01:23:33 | 显示全部楼层
这个问题我回答过,我的程序如下(不是对你的程序的优化,从今年开始,我已经不再回答花时间多的问题了,不好意思):
// 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后
// 留下的是原来第几号的那位
#include<stdio.h>
#define nmax 50 
main()
{
        int i, k, m, n, num[nmax], *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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 01:40:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-13 02:20 编辑
#include <stdio.h>

int main(void)
{
        int d[200] = {0} , e , i , j  , n                         ;
        scanf("%d" , & n)                                         ;
        for(i = 1 ; i < n + 1 ; i ++) d[i] = i                    ; // 用索引号为数组元素编号
        for(e = 0 , i = 1 ; n > 2 ;) {
                e ++                                              ;
                if(e == 3) {                                        // 数到 3
                        for(j = i ; j < n ; j ++) d[j] = d[j + 1] ; // 数组整体向前搬家,删除数到 3 的数组元素
                        e = 0                                     ;
                        n --                                      ;
                } else {
                        i ++                                      ;
                }
                if(i > n) i = 1                                   ;
        } 
        printf("%d\n" , d[2])                                     ; // 最后剩下 2 个元素,显示后面的那个 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 04:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表