3n+1用c#怎么做

对任何一个白然数口,如果它是偶数,那么把它欣掉一半;如果它是奇数,那么把(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);
    }
}
  • 这篇博客: C与C++程序设计学习笔记中的 5、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的字符串来表示。例如:0010110011 就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #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;
    }