PAT乙级 1005 继续(3n+1)猜想 (25分)

PAT乙级练习总结

PAT乙级 1005 继续(3n+1)猜想 (25分) 希望我的思路可以帮助你。


一、1005题目

在这里插入图片描述在这里插入图片描述

输入样例:
6
3 5 6 7 8 11
输出样例:
7 6

二、分析


根据题目最多输入100位,且输入的数为1<n<=100;想到用索引,以输入的数为数组下标,这个数n砍一下就和索引【n】里去对比如果在索引【n】中存在了,则这个数不是关键数,把索引【n】的位置变为0;最后去除索引数组中为0的数,依次把下标填入,最后倒着输出即可。

(演示仅供参考,变0的是索引【n】的值)

输入后----->
索引:3  5  6  7  8  11
--------->
算3:5 8 4 2 1;
索引:3  0  6  7  0  11
算5:8 4 2 1;
索引:3  0  6  7  0  11
算6:3 5 8 4 2 1;
索引:0  0  6  7  0  11
算7:11 17 26 13 20 10 5 8 4 2 1;
索引:0  0  6  7  0  0
算8:4 2 1;
索引:0  0  6  7  0  0
算11:17 26 13 20 10 5 8 4 2 1;
索引:0  0  6  7  0  0

下面展示 成功代码

// 1005代码
#include<stdio.h>
#define MAXS 101
int main(){
	int n,i,j;
	scanf("%d",&n);
	int num,suo[MAXS]={0};//索引中初始为0 
	for(i=0;i<n;i++){
		scanf("%d",&num);
		suo[num]=1;//以输入值为下标,标记为1 
	}
	for(i=1;i<100;i++){
		if(suo[i]){//如果索引【i】存在 
			for(j=i;j>1;){
				if(j%2==0){
					j/=2;
				}
				else{
					j=(3*j+1)/2;
				}
				if(j<100&&suo[j]){//索引中有值存在并且j不越界 
					suo[j]=0;
				}
			}
		}
	}
	for(i=1,j=1;i<=100;i++){//从下标1开始 
		if(suo[i]!=0){//如果索引【i】不等于0则i为关键字 ,从1开始存 
			suo[j]=i;
			j++;
		}//如果索引【i】==0则i++,j不变等着存下一个 
	}
	suo[j]='\0';
	printf("%d",suo[j-1]);//按要求输出 
	for(j=j-2;j>=1;j--){
		printf(" %d",suo[j]);
	}
	return 0;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiaoooooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值