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";
}
}