1 题目要求
https://www.patest.cn/contests/pat-b-practise/1005
2 源代码
#include<stdio.h> int main(void){ int num[101]; int k,n,i,length; //初始化数组,将数组每个数都设置为-1 for(i=0;i<101;i++){ num[i]=-1; } scanf("%d",&k);//输入个数 for(i=0;i<k;i++){ scanf("%d",&n); num[n]=0;//输入5,就把数组下表为5的数子设置为0,说明该数组下标被输入过 } /*************************************/ for(i=0;i<101;i++){ if(num[i]!=0){ continue; //如果数组的值不为0,就不执行下面的语句,进入下一次循环。不为0的含义是:说明么牛有输入过 } n=i; //把i赋给n while(n!=1){ if(n%2==0){ n=n/2; if(n<=100){ num[n]=1; } }else{ n=(3*n+1)/2; if(n<=100){ num[n]=1; } } } } //剩下的就是个数了 for(i=0,length=0;i<101;i++){ if(num[i]==0){ length++; } } //倒序输出 for(i=100;i>1;i--){ if(num[i]==0){ length--; if(length!=0){ printf("%d ",i); }else{ printf("%d",i); break; } } } }
3 这题其实用java反而思路清晰一些,但是用c的话可以看出底层存储的巧妙思路,这题和多项式的题目其实有点类似,巧妙的利用了数组存储
1 定义数组,初始化数组。
2 输出第二行数字,接收到后就将输入的数字的对应的数组下标的数组的值改为0 ,说明被输入过
3 遍历数组了,如果数组的值不为0,则跳出循环不执行。若为0,则对其进行逻辑判断,并将每一个数子的逻辑判断得到的数组的对应的数组下标的值设置为1
4 最后,剩下的为0的,就是要的关键数