#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;
}
pat乙级1005 继续(3n+1)猜想
最新推荐文章于 2025-12-12 18:31:01 发布
本文介绍了一种使用递归和数组来跟踪数字出现情况的算法。通过扫描输入的数字,更新二维数组并标记重复出现的数字,最后逆序打印未被包含的数字。核心在于利用test函数的递归实现和数组操作技巧。
398

被折叠的 条评论
为什么被折叠?



