美团8-30:编程题

发布于:2025-08-31 ⋅ 阅读:(30) ⋅ 点赞:(0)

美团8-30:编程题

题目1

小美有一个数字 n,小美打算按照以下规则对 n 进行操作:
· 如果n是偶数,让n除以2;
· 否则,让 n 乘以 3 再加 1。
小美想知道,在操作k次后,n 会变成多少。

思路

这道题的思路首先肯定是进行模拟即我们使用一个循环来对n进行一步一步的操作,这种方法理论是可行的但是题目是有时间要求的。所以只要k变得很大就肯定会超时,所以这种方法没法完全ac。那么我们就要思考有没有其他的情况可以简化循环了,光想肯定是没法得到答案的我们试着给前面十个数字的转换过程写一下,首先是1,它是奇数所以会变成4,然后4是偶数又变成2,2是偶数又变成1。这不是变成一个循环了吗即1241…的循环,那么只要n变成了1我们就只需要让剩下的操作次数取余一个3,这样得到的数字不就分别对应着1,2,4吗。

代码

#include <iostream>
using namespace std;

int main()
{
    int n,k;
    cin >> n >> k;
    if(k == 0)
    {
        cout << n << endl;
    }
    //最后n会陷入1 2 4 1的循环所以我们先看n会不会变成1
    while(k > 0 && n != 1)
    {
        if(n % 2 == 0)
        {
            n /= 2;
        }
        else
        {
            n *= 3 + 1;
        }
        k--;
    }
    if(k == 0)
    {
        cout << n << endl;
    }
    else
    {
        k %= 3;
        if(k == 0)
        {
            cout << 1 << endl;
        }
        else if( k == 1)
        {
            cout << 2 << endl;
        }
        else if( k == 2)
        {
            cout << 4 << endl;
        }
    }
    return 0;
}

题目2

小美是一位数学爱好者,她想知道给定的有理数在 k 进制下是否为一个 有限小数。换句话说,她希望判断在基数为k的表示中,该分数的小数部分是否会在有限位后结束,而不是无限循环。
例如,-1/2 在十进制下表示为 0.5,是有限小数;相比之下,1/3在十进制下表示为 0.3333…,不是有限小数。

思路

看了题目之后我们必须要知道的一点就是如何判断一个分数在k进制下是有限小数,这涉及到数学知识了。答案是:一个分数在k进制下想要是有限小数那么它的最简分母的质因子必须全部包含在k的质因子里,也就是说最简分母的质因子和k的质因子是一个包含关系,k的质因子包含最简分母的质因子。
那么质因子是什么呢?官方定义是质因子(质因数)是指能整除给定正整数的质数。例如,12 的质因子是 2 和 3,因为 12 = 2 × 2 × 3。
那么我们在得到一个分数后首先要做的就是进行化简,想要化简就必须找到分子分母的最大公约数而寻找最大公约数的办法有很多我们使用最简单的辗转相除法。在得到最简分母后我们就需要寻找分母和k的公共质因子,同样我们也可以使用寻找分母和k的最大公约数的办法,在得到质因子后我们让分母除以质因子,然后再次寻找与k的质因子再除以质因子。以此循环直到质因子为1就代表分母和k的所有的质因子都找到了,这时候如果分母为1就代表这个分母的质因子是包含在k里面的,如果不为1说明这个分母还有其他的质因子。

代码

#include<iostream>
using namespace std;

long long gcd(long long p, long long q)
{
	//辗转相除法
	while (p != 0)
	{
		long long tmp = q % p;
		q = p;
		p = tmp;
	}
	return q;
}

bool checkcycle(long long p, long long q, long long k)
{
	//如果最简分母的质因子包含在k的质因子里就说明这个分数是有限小数
	//求分子分母的最大公约数从而得到最简分母
	long long sq = gcd(p, q);
	q = q / sq;
	//如果最简分母为1则返回true
	if (q == 1)
	{
		return true;
	}
	//求得q和k的质因子也就是最大公约数
	long long d = gcd(q, k);
	while (d != 1)
	{
		q /= d;
		d = gcd(q, k);
	}
	if (q == 1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		long long p, q, k;
		cin >> p >> q >> k;
		if (p == 0)
		{
			cout << "yes" << endl;
		}
		bool res = checkcycle(p, q, k);
		if (res == true)
			cout << "yes" << endl;
		else
			cout << "no" << endl;
	}


	return 0;
}