注册 登录
编程论坛 C语言论坛

没看答案的恶果,做了一上午外加晚上一小时

see235959850 发布于 2017-01-21 19:57, 1406 次点击
程序代码:
#include<stdio.h>
int main()
{
    int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int i = 0, j = 0, n = 0, m = 2, h = 10, r, s;
    for (i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");
    for (r = 5; r > 0; r--)
    {
        i = 0;
        while (j < h)
        {
            a[i++] = a[j++];
            n = i;
            if (j == m)
            {
                j++;
                m = m + 3;
            }
        }
        h = n;
        if (m == j + 2)
        {
            m = 3;
            j = 1;
        }
        else if (m == j + 1)
        {
            m = 1;
            j = 0;
        }
        s = n;
        for (i = 0; i < s; i++)
            printf("%d ", a[i]);
        printf("\n");
        n = 0;
    }
    return 0;
}

10 回复
#2
see2359598502017-01-21 20:34
修改版
程序代码:
#include<stdio.h>
void sort(int *p, int u)
{
    int i = 0, j = 0, h = u, m = 2, n, r, s;
    for (r = 5; r > 0; r--)
    {
        i = 0;
        while (j < h)
        {
            p[i++] = p[j++];
            n = i;
            if (j == m)
            {
                j++;
                m = m + 3;
            }
        }
        h = n;
        s = n;   
        if (m == j + 2)
        {
            m = 3;
            j = 1;
        }
        else if (m == j + 1)
        {
            m = 1;
            j = 0;
        }
        for (i = 0; i < s; i++)
            printf("%d ", p[i]);
        printf("\n");
        n = 0;
    }
}

int main()
{
    void sort(int *p, int u);
    int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int i;
    for (i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");
    sort(a, 10);
    return 0;
}
#3
see2359598502017-01-21 20:57
答案设计的果然精巧
#4
renkejun19422017-01-21 21:00
所以……题目是什么?
#5
九转星河2017-01-21 21:02
初看像约瑟夫环问题~手机初步验证果然是~还好我这段时间编程没有退化得太厉害~
#6
see2359598502017-01-21 21:28
回复 4楼 renkejun1942
n个人围圈,顺序排序,叫到3号的退出,问最后剩下的是原先的几号
#7
see2359598502017-01-21 21:29
回复 5楼 九转星河
题目在上面,还好答案对着呢
#8
九转星河2017-01-21 21:30
回复 7楼 see235959850
这就是约瑟夫环问题啊~
#9
renkejun19422017-01-21 22:27
回复 6楼 see235959850
我只用0,1,2,3,4,5,6,7,8,9,10测试了一下,貌似对的上,没有用其他的数组做测试,没有写找到剩下的是第几号,但是很容易,只要遍历数组找到非特殊值就可以了。

嗯……,写的很粗糙,很多东西都没考虑。

#include <stdio.h>
int main(void)
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int i,j,n;
j = 0;
n = 0;

while(n != 1)
{
     for(i = 0;i < 10; i++)
     {
         if(a[i] == -1)
             continue;
         else if(!(++j%3))
         {
             a[i] = -1;
             j = 0;
         }
         else if(a[i] != -1)
             printf("%d ",a[i]);
     }
     putchar('\n');

     for(i = 0,n = 0; i < 10;i++)
         if(a[i] != -1)
             n++;
}

return 0;
}

[此贴子已经被作者于2017-1-21 22:55编辑过]

#10
renkejun19422017-01-21 23:06
编辑掉。

[此贴子已经被作者于2017-1-21 23:09编辑过]

#11
九转星河2017-01-23 19:30
我也弄个简单点的来看看~

程序代码:
#include<stdio.h>
#define N 3
#define S(a) sizeof(a)/sizeof(a[0])
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,10};

    int i=0;
    int j=0;
   
    for (i=0;j!=N*S(a);++i,i%=S(a))
    {
        if (a[i]!=0)
            j++;
        else
            continue ;
            
        if (j%N==0)
        {
             printf ("%d ",a[i]);
             a[i]=0;
        }
    }
   
    printf("\n");
   
    return 0;
}
1