PAT:1005 继续(3n+1)猜想(25 分)C语言

PAT 1005 继续(3n+1)猜想(25 分) C语言

#include<stdio.h>

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

    //输入n个整数 
    int zs[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d", &zs[i]);
    }

    /*
    主要思想:设置一个标志数组,默认情况数组值为0;然后将对应下标为输入数据 i 的标志设为1;
    如果数据 i 在递推过程中出现,那么标志位数组下标为i的那个数组值设为2。
    然后将下标值为1的存入一个数组,按降序排序输出 
    */ 
    int biaozhi[101] = {0};  
    int save[10000] = {0};
    int sub=0;
    int temp;

    for(int i=0;i<n;i++)
    {
        int m = zs[i];  //某个输入 
        if(biaozhi[m] == 2)  //如果其标志为2,则跳过 
        {
            continue;
        }
        biaozhi[m] = 1;  //否则设为1 

        while(m!=1)
        {
            if(m%2==1)
            {
                m = (3*m+1)/2;   //递推过程出现的数字 
                biaozhi[m] = 2;
            }
            else
            {
                m = m/2;  //递推过程出现的数字 
                biaozhi[m] = 2;
            }
        }
    }

    //将数组值为1的下标存入另一个数组 
    for(int k=0;k<101;k++)
    {
        if(biaozhi[k] == 1)
        {
            save[sub] = k;
            sub++;
        }
    }

    //降序排序 
    for(int i=0;i<sub;i++)
    {
        for(int j=i+1;j<sub;j++)
        {
            if(save[i]<save[j])
            {
                temp = save[i];
                save[i] = save[j];
                save[j] = temp; 
            }
        }
    }
    for(int k=0;k<sub-1;k++)
    {
        printf("%d ", save[k]);
    }
    printf("%d", save[sub-1]);
}

猜你喜欢

转载自blog.csdn.net/qq_26793775/article/details/82499693
今日推荐