记录C语言冰雹猜想的实现过程
文章目录
- 记录C语言冰雹猜想的实现过程
- 问题引入
- 一、冰雹猜想问题分析
- 二、代码实现
- 写在最后
问题引入
冰雹猜想:任一正整数x,如果x是奇数就乘以3加1,如果是偶数就除以2,反复计算,最终都将会得到数字1。
一、冰雹猜想问题分析
冰雹猜想的思路很简单,洛谷上有道引用冰雹猜想的题:
先分析一下样例 的实现过程:
二、代码实现
(这是个错误的代码,来分析一下问题)
#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*/
}
大体思路没什么问题,但是有两个测试点没通过
于是我运行了一下,发现错在“1”这里
也就是说当程序认为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的问题解决了
但是最后一个测试点还是有问题
搜索了这个报错的原因,如下图。还是不知道该如何解决这个问题,于是我换了一种思路
正确的代码在这里!
#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;
}
终于通过了!
写在最后
关于那个报错还是有点不理解,是代码写错了还是其他问题,希望大家多多指教