pat乙级1005 继续(3n+1)猜想

本文介绍了一种使用递归和数组来跟踪数字出现情况的算法。通过扫描输入的数字,更新二维数组并标记重复出现的数字,最后逆序打印未被包含的数字。核心在于利用test函数的递归实现和数组操作技巧。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
1,定义一个二维数组a[101][101]={0},扫描到一个数temp,就把a[temp][0]改为1,表明有这个数字
2,测试3的时候,出现了3,4,5,8,4,2,1,则把该行的a[3][3],a[3][4],a[3][5].....置为1;表明测试3的时候也测试了这几个数字
3,建立整个数组之后,因为测试3的时候,把3,4,5,8,4,2,1都测了,所以a[4][0],a[8][0],a[4][0]....都置为0(不能把a[3][0]置为0,因为那是他自己),表示3已经包含他们
4,逆序打印剩下的a[k=100,99,98....][0]==1的值,因为没有人包含他们
*/
void test(int n,int *a)
{
    if(n<=100) a[n]=1;
    if(n==1) return;
    else if(n%2==0) {test(n/2,a);}
    else if(n%2!=0) {test((3*n+1)/2,a);}
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int a[101][101];
    for(i=0;i<101;i++)
    for(j=0;j<101;j++)
    a[i][j]=0;
    int temp;
    for(i=0;i<n;i++)
    {
        scanf("%d",&temp);
        a[temp][0]=1;
        test(temp,&a[temp][0]);
    }
    for(i=1;i<101;i++){
        if(a[i][0]==1){
            for(j=1;j<101;j++){
                if(a[i][j]==1&&j!=i) a[j][0]=0;
            }
        }
    }
    int f=1;
    for(i=100;i>0;i--){
        if(a[i][0]==1&&f!=1) printf(" %d",i);
        if(a[i][0]==1&&f==1) {printf("%d",i);f=0;}
    }
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值