刷题记录

PAT刷题–12.31

1032乙级 继续3n+1猜想
主要思路是使用两个数组,一个数组用来存储输入的数,另一个数组用来做标记,反是在一个数验证猜想过程中得到的其他的数,全部将其标志位置为0,并且为了不超过时间限制,只要某个数被置为了0,就不再对其进行进行猜想验证。
遇到的坑:在一开始设置数组大小为100,会出现数组越界问题,主要是没有考虑到在猜想验证过程中数组可能会因为*3而增大,因此在设置数组大小时应考虑这一点,将其尽量设置的大。

#include "stdio.h"int main()
{    int n, k=0,t=0;    
int A[10000] = { 0 };   
 int B[10000] = { 0 };    
 int max = 0;    
 int count=0;    
 scanf("%d\n", &n);   
  for (int i = 1; i <= n; i++)    
  {    scanf("%d", &B[i]);     A[B[i]] = 1;    }    
  for (int i = 1; i <= n; i++)    
  {        if (max < B[i])            max = B[i];    }   
   for (int i = 1; i <= n; i++)   
    {            t = B[i];            
    while (B[i] > 1&&A[t]!=0)           
     {               
      if (B[i] % 2 == 0)                
      {                    
        B[i] = B[i] / 2;                   
       if (A[B[i]] != 0)                    
       {    A[B[i]] = 0;    }               
       }                
       else if (B[i] % 2 != 0)                
       {                   
        k = B[i] * 3 + 1;                    
        B[i] = k / 2;                    
        if (A[k / 2] != 0)   {   
          A[k / 2] = 0;       }  
        }            
        }    
     }   
         for (int i = max; i >= 1; i--)   
          {        if (A[i] != 0)           
                      count++;    }    
          for (int i = max; i >= 1; i--)    
          {   if (A[i] != 0&&count>1)       
                {    printf("%d ",i);         
                      count--;        }        
            else if(count==1&&A[i]!=0)            
             printf("%d\n",i);    }}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值