MyFirstCSDNBlog~ 1001 害死人不偿命的(3n+1)猜想 (15 分) PAT乙级真题

written by: 东篱下の悠然

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

      首先看到这个题目描述,很简单~ 不用找规律 全模拟一下很快出结果。而且主题目除了前两句信息有用 后面都是“水话”不用看~ ps注意是要求输出 砍了多少次 噢,每次循环要计数器变量(我在这里定义了count)自增一次。代码如下~
#include <iostream>				//标准输入输出流头文件,cin 和 cout 要在这里面调用

using namespace std;			//声明一个命名空间
int main(){
    int n, count = 0;			//定义两个变量,一个存储输入的数据,一个做计数器
    cin >> n;					//从键盘读入一个数字并存入变量n
    
    while( n != 1){				//当n没有被砍到1时,继续循环,继续砍
        if( n % 2 == 0)			//如果n能被2整除,就是偶数:
        n /= 2;					//是偶数就对半砍,并把结果刷新给变量n它自己
    else						//不是偶数就是奇数了呗
        n = ( 3*n + 1) / 2;		//是奇数就乘3加1,并且还要对半砍。这里可以不加小括号
    count ++;					//对n加工一次了,计数器自增一次
    }
    cout << count;				//输出结果,就是计数
    return 0;
}
ok, 上AC的图:

在这里插入图片描述

      还有第二种解法~ 有一个灵活性极强的语句:goto语句,可以取代while循环,可以任意 随意 无条件地灵活转移语句,改变程序流向。但有缺点:它的灵活性实在太强啦,一不留神就陷入死循环,不太容易掌控。代码如下:
#include <iostream>

using namespace std;
int main(){
    int n, count = 0;
    cin >> n;
    
    A:{						//设置标志,冒号结束
        if( n == 1) {		//进入循环首先判断n是不是=1。如果成立,就输出结果 并结束循环
            cout << count;
            return 0;
        }
        if( n % 2 == 0) n /= 2;	//上同
        else n = ( 3*n + 1) / 2;
        
        count ++;
    }
    goto A;
}
AC图如下:

在这里插入图片描述

      还有第三种解法…仔细读题,看到两个“砍掉一半”的字眼吗??是的,不论它是奇数还是偶数都逃不过被“砍掉一半”。把“砍掉一半”的操作提出来码在后面~ 只要 n != 1 满足,进入循环了,“砍掉一半”的操作只写一次就好咯^ _ ^因此这里是第一版的简洁版。代码如下:
#include <iostream>

using namespace std;
int main()
{
    int num,count = 0;
    cin >> num;
    while( num != 1 )
    {
        if ( num%2 == 1) 		//奇数要先3*n+1再砍。偶数跳过这句if,直接砍
        num = num*3 +1;
        
        num /= 2;
        
        count ++;
    }
    cout << count;
    return 0;
}
上AC图~~

♥如有谬误还请指正~~蟹蟹♥
发布了9 篇原创文章 · 获赞 3 · 访问量 874

猜你喜欢

转载自blog.csdn.net/wenya13/article/details/102941494