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]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值