对任何一个白然数口,如果它是偶数,那么把它欣掉一半;如果它是奇数,那么把(30+1)
欣掉一半。这样一直反复张下去,最后一定在某一步得到口-1。卡拉兹在 1950 年的世界
数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很
俊很天真的命题,结果用得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展-。
我们今天的题目不是证明卡拉效猜想,而是对给定的任一不超过 1000 的正整数口,简单地数一下,需要多少步(欣几下)才能得到 n-1?
输入格式:每个测试输入包含 1个测试用例,即给出自然数口的值。
输出格式:输出从口计算到 1 需要的步数。
题目意思是计算到一还是n-1?如果是1的话,那么下面这个程序应该能行
using System;
class Program {
static void Main(string[] args) {
// 读入输入的整数n
int n = Convert.ToInt32(Console.ReadLine());
// 计算反复执行操作后得到1的步数
int steps = 0;
while (n != 1) {
if (n % 2 == 0) {
n /= 2;
} else {
n = 3 * n + 1;
n /= 2;
}
steps++;
}
// 输出步数
Console.WriteLine(steps);
}
}
#include <stdio.h>
int ti[11] = { 0 }; //用来存储每道题的回答情况0或者1,0表示错误,1表示正确
//提醒:数组ti的编号实际用1-10
//score表示当前得分,num是当前第num道题目
void f(int score, int num)
{
if (num == 11)//10道题目全部做完
{
if (score == 100)
{
int i = 0;
for (i = 1; i <= 10; i++)
printf("%d", ti[i]);
printf("\n");
}
}
else //10道题目没有做完
{
ti[num] = 1; //讨论第num道题目的正确情况
f(score * 2, num + 1);
ti[num] = 0; //讨论第num道题目的错误情况
f(score - num, num + 1);
}
}
int main(void)
{
f(10, 1);//从基础分10分开始,从第1题开始
return 0;
}