PAT乙级1001 害死人不偿命的(3n+1)猜想 & 1002

1001

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?


#include <iostream>
using namespace std;

int main()
{
	int i = 0, a = 0;
	cin >> a;
	while (a != 1)
	{
		if (a % 2 == 0)
		{
			a = a / 2;
			i++;
		}
		else
		{
			a = (a * 3 + 1) / 2;
			i++;
		}
	}
	cout << i;
	return 0;
}

1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

~~~C++中string相当于一个字符型数组,可以直接储存,使用也十分方便。

#include <iostream>
#include<stack>
#include<string>
using namespace std;

string toc(int i);


int main()
{
	stack<string> s;

	string a;
	cin >> a;
	int i = 0;
	for (int j = 0; j < a.size(); j++)//因为数字可能非常大所以使用string保存
	{                                 //当字符做加减运算时会自动转换成asc2码
		i += a[j] - 48;               //减去48就是减去‘0’的ASC2码的值
	}

	while (i != 0)
	{
		s.push(toc(i % 10));
		i = i / 10;
	}
	while (!s.empty())
	{
		cout << s.top();
		s.pop();
		if (!s.empty())
			cout << " ";
	}
		
	return 0;
}

string toc(int i)
{
	switch (i)
	{
	case 0:
		return "ling";
	case 1:
		return "yi";
	case 2:
		return "er";
	case 3:
		return "san";
	case 4:
		return "si";
	case 5:
		return "wu";
	case 6:
		return "liu";
	case 7:
		return "qi";
	case 8:
		return "ba";
	case 9:
		return "jiu";
	}

}

猜你喜欢

转载自blog.csdn.net/qq_38386991/article/details/103896242
今日推荐