记录C语言冰雹猜想的实现过程




文章目录

  • 记录C语言冰雹猜想的实现过程
  • 问题引入
  • 一、冰雹猜想问题分析
  • 二、代码实现
  • 写在最后



问题引入

冰雹猜想:任一正整数x,如果x是奇数就乘以3加1,如果是偶数就除以2,反复计算,最终都将会得到数字1。


一、冰雹猜想问题分析

冰雹猜想的思路很简单,洛谷上有道引用冰雹猜想的题:

Python编冰雹猜想 python源代码冰雹猜想_数组

先分析一下样例 的实现过程:

Python编冰雹猜想 python源代码冰雹猜想_i++_02

二、代码实现

(这是个错误的代码,来分析一下问题)

#include<stdio.h>
int main()
{
   int i,j,n,m,a[100],t,k=0;
   scanf("%d",&n);
   m=n;
     for(i=0;;i++)
    { 
        if(n%2==0)/*判断n是否为偶数*/
      {
         for(i=0;;i++)
        {
            t=n/2;
            a[k++]=t;
            n=t;
            if(n%2!=0)break ;
        }
      }
        else
      {
         for(i=0;;i++)
        {
            t=3*n+1;
            a[k++]=t;/*k可以作为新数组的下表,同时也起到计数器的作用*/
            n=t;
            if(n%2==0)break;
        }
      }
    if(n==1)break;/*控制外循环的条件是n为1*/
    }
    for(i=k-1;i>=0;i--)/*新数组里有k个元素,因此输出数组时对应下标为0-k-*/
   {
     printf("%d ",a[i]);
   }
   printf("%d",m);/*新数组并没有把最初的n放进去,因此还要输出n本身,由于经过上面的循环n的值已经改变,所以前面把原始的n储存在m中,这里输出m即为输出原始的n*/
   }

大体思路没什么问题,但是有两个测试点没通过

Python编冰雹猜想 python源代码冰雹猜想_#include_03


于是我运行了一下,发现错在“1”这里

Python编冰雹猜想 python源代码冰雹猜想_github_04



也就是说当程序认为1为奇数,输入1后进行了3*1+1的计算,但是题中的要求是如果输入1,输出结果也为1,所以我又把输入1和非1的情况分开了

#include<stdio.h>
int main()
{
   int i,j,n,m,a[100],t,k=0;
   scanf("%d",&n);
   m=n;
   if(n!=1)/*在这里做了修改*/
   {
     for(i=0;;i++)
    { 
        if(n%2==0)
      {
         for(i=0;;i++)
        {
            t=n/2;
            a[k++]=t;
            n=t;
            if(n%2!=0)break ;
        }
      }
        else
      {
         for(i=0;;i++)
        {
            t=3*n+1;
            a[k++]=t;
            n=t;
            if(n%2==0)break;
        }
      }
    if(n==1)break;
    }
    for(i=k-1;i>=0;i--)
   {
     printf("%d ",a[i]);
   }
   printf("%d",m);
   }
  else
   printf("1");
}

现在输入1的问题解决了

Python编冰雹猜想 python源代码冰雹猜想_Python编冰雹猜想_05

但是最后一个测试点还是有问题

Python编冰雹猜想 python源代码冰雹猜想_Python编冰雹猜想_06


搜索了这个报错的原因,如下图。还是不知道该如何解决这个问题,于是我换了一种思路

Python编冰雹猜想 python源代码冰雹猜想_Python编冰雹猜想_07


正确的代码在这里!

#include<stdio.h>
int main()
{
 int n;
 scanf("%d",&n);
 int a[200];
 int i;
 int count=0;/*换回了计数器的方法*/
 for(i=0;;i++)
 {
  if(n%2==0)
  {
   a[i]=n;
   n=n/2;
   if(a[i]==1)
   break;
  }
  else
  {
   a[i]=n;
   n=n*3+1;
   if(a[i]==1)
   break;
  }
  count++;
 }
 for(i=count;i>=0;i--)
 {
  printf("%d ",a[i]);
 }
 return 0;
}

Python编冰雹猜想 python源代码冰雹猜想_i++_08


终于通过了!

写在最后

关于那个报错还是有点不理解,是代码写错了还是其他问题,希望大家多多指教