• 1005 继续(3n+1)猜想(C#)


    一、题目内容:

    卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

    当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。

    现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

    输入格式:

    每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<),第 2 行给出 K 个互不相同的待验证的正整数 n (1)的值,数字间用空格隔开。

    输出格式:

    每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

    输入样例:

    6
    3 5 6 7 8 11
    

    输出样例:

    7 6

    二、编码思路:

    本题的主要意思可以理解为,给出的正整数数列中,任意一个n,如果不是数列中其他数的3n+1猜想的值,则为关键数。所以,编码思路为:

    • 先计算出数列中所有正整数的3n+1猜想的值,存在一个数组或list中。3n+1猜想具体内容见“1001 害死人不偿命的(3n+1)猜想”。
    • 循环数列,判断数列中每个正整数是否都在第一步计算的数组(或list)中,如果不是,则为而关键数,将关键数添加到输出数组(或list)中。
    • 将第二步得到输出数组(或list),按从大到小排序
    • 循环输出数组(或list),按要求输出结果

    三、代码如下:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Diagnostics;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Text.RegularExpressions;
     7 using System.Threading.Tasks;
     8 
     9 namespace ConsoleApp1
    10 {
    11     class Program
    12     {
    13         static void Main(string[] args)
    14         {
    15             string line;
    16             while ((line = Console.ReadLine()) != null)
    17             {
    18                 int k = int.Parse(line);
    19                 string data = Console.ReadLine();
    20                 string[] datas = data.Split();
    21                 List<int> values = new List<int>();
    22                 foreach (string d in datas)
    23                 {
    24                     int n = int.Parse(d);
    25                     while (n != 1)
    26                     {
    27                         if (n % 2 == 0)
    28                         {
    29                             n = n / 2;
    30                         }
    31                         else
    32                         {
    33                             n = (3 * n + 1) / 2;
    34                         }
    35                         if (n != 1)
    36                             values.Add(n);
    37                     }
    38                 }
    39 
    40                 List<int> result = new List<int>();
    41                 for (int i = 0; i < k; i++)
    42                 {
    43                     int num = int.Parse(datas[i]);
    44                     if (values.FindIndex(m => m.Equals(num)) >= 0)
    45                     {
    46                         continue;
    47                     }
    48                     else
    49                     {
    50                         result.Add(num);
    51                     }
    52                 }
    53                 result.Sort((a, b) => b.CompareTo(a));
    54                 string outStr = "";
    55                 foreach (int item in result)
    56                 {
    57                     if (outStr != "")
    58                     {
    59                         outStr += " ";
    60                     }
    61                     outStr += item;
    62                 }
    63                 Console.WriteLine(outStr);
    64             }
    65             Console.ReadKey();
    66         }
    67     }
    68 }

    代码已通过。

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/bossing/p/11091152.html
Copyright © 2020-2023  润新知