角谷猜想C++实现

该博客介绍了如何用C++编程实现著名的角谷猜想,即一个正整数通过不断乘以3加1(如果为奇数)或除以2(如果为偶数),最终会回到1。代码示例中,程序接收一个正整数输入,然后进行变换步数的计算,直至返回到1。数据范围限制为x≤10^5,并提供了样例输入和输出。

题目描述                                          

数学上有一个著名的猜想——角谷猜想

今天我们要用C++来实现这个“角谷猜想”                                            

一个正整数 xx​,如果是奇数就乘以 33​ 再加 11​,如果是偶数就除以 22,这样经过若干个次数,最终回到 11。

给定一个正整数 xx,请你求出需要经过多少步变换才能回到 11。

输入格式

一行一个正整数 xx。

输出格式

输出要多少步变化,如题目描述。                                                        

样例数据

样例输入#1

5

样例输出#1

5

样例解释

步数 值
0    5
1    16
2    8
3    4
4    2
5    1

数据范围

对于 100%100%​ 的数据,有 x≤105x≤105​。                                                                              

据日本和美国的数学家攻关研究,在小于 7×10117×1011​​ 的所有的正整数,都符合这个规律。

#include<iostream>
using namespace std;

int main(){
	long long x,maxy=0;
	cin >> x;
	for(int i=x;i<=2000000;i++){
		maxy+=1;                                                                                               
		if(x%2==0){                                                             
			x=x/2;
			if(x==1){                                                  
				cout << maxy;
				break;
			}
		}else{
			x=x*3+1;
		}
    }
	return 0;
}

大家可以试试这个代码

有用记得关注我哦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

猜想(又称科拉兹猜想)是一个在数学和计算机科学中广为人知的未解问题。其核心思想是:对于任意一个正整数 $ n $,如果 $ n $ 是偶数,则将其除以 2;如果 $ n $ 是奇数,则将其乘以 3 并加 1。重复这一过程,最终总会得到 1。 下面是一个完整的 C++ 实现,展示了如何通过循环和递归两种方式来验证猜想,并输出每一步的操作过程和最终的步数。 --- ### 使用循环实现猜想 该方法通过 `while` 循环不断执行猜想的操作,直到数值变为 1,并输出每一步的结果。 ```cpp #include <iostream> void collatzConjecture(int n) { while (n != 1) { std::cout << n << " "; if (n % 2 == 0) n = n / 2; else n = n * 3 + 1; } std::cout << n << std::endl; } int main() { int number; std::cout << "请输入一个正整数:"; std::cin >> number; collatzConjecture(number); return 0; } ``` --- ### 使用递归实现猜想 该方法采用递归方式实现猜想,并统计操作的步数。 ```cpp #include <bits/stdc++.h> using namespace std; int steps = 0; int collatzSteps(int n) { if (n == 1) { return steps; } else { steps++; if (n % 2 == 0) return collatzSteps(n / 2); else return collatzSteps(3 * n + 1); } } int main() { int number; std::cout << "请输入一个正整数:"; std::cin >> number; int totalSteps = collatzSteps(number); std::cout << "总共需要 " << totalSteps << " 步到达 1" << std::endl; return 0; } ``` --- ### 扩展功能:验证多个数并找出最大步数 以下代码展示了如何验证从输入值开始到 2000000 的所有整数,并找出其中需要最多步骤达到 1 的数值。 ```cpp #include <iostream> using namespace std; int collatzSteps(long long n) { int steps = 0; while (n != 1) { steps++; if (n % 2 == 0) n /= 2; else n = 3 * n + 1; } return steps; } int main() { long long x; int maxSteps = 0; long long numberWithMaxSteps = 0; cout << "请输入起始整数:"; cin >> x; for (long long i = x; i <= 2000000; ++i) { int steps = collatzSteps(i); if (steps > maxSteps) { maxSteps = steps; numberWithMaxSteps = i; } } cout << "在范围 [" << x << ", 2000000] 中," << numberWithMaxSteps << " 需要最多的步骤:" << maxSteps << " 步" << endl; return 0; } ``` --- ### 算法分析与优化建议 - **时间复杂度**:对于单个数的验证,时间复杂度约为 $ O(k) $,其中 $ k $ 是达到 1 所需的步数。由于步数与输入大小无明确关系,因此该问题的时间复杂度难以精确分析。 - **空间复杂度**:由于未使用额外数据结构,空间复杂度为 $ O(1) $。 - **优化方向**: - 可以使用记忆化(Memoization)技术缓存中间结果,避免重复计算。 - 多线程处理多个输入值的验证过程,提高整体效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值