如何在不使用字符串的情况下创建/读取带有特定小数的数字?

时间:2019-07-12 14:23:25

标签: c# algorithm

我正在尝试执行以下SPOJ问题:

https://www.spoj.com/problems/GUANGGUN/

问题是,我不知道如何正确创建带有特定小数位的数字(例如:如果将4输入到控制台,它将创建1.1111,或者在输入的情况下8中的{:1.11111111)。我尝试使用string s来执行此操作,但是它超过了此问题的惩罚期限

但是即使那样,我仍然不知道如何在没有字符串的情况下使用variable[x]在特定位置读取小数。

非常感谢您的帮助。

编辑: 我输入了以下代码作为解决方案:

using System;
using System.Linq;
using System.Collections;

namespace SPOJG
{
    class Program
    {
        private static long Formula(long n) => 81 * (n / 9) + (n % 9) * (n % 9);
        static void Main(string[] args)
        {
            bool takeInputs = true;

            Queue inputs = new Queue();

            while (takeInputs)
            {
                string inputString = Console.ReadLine();

                int n;
                bool isNumber = int.TryParse(inputString, out n);

                if (isNumber)
                {
                    inputs.Enqueue(inputString);
                }
                else
                {
                    while (inputs.Count > 0)
                    {
                        GUANGGUN(Convert.ToInt32(inputs.Dequeue()));
                    }

                    takeInputs = false;
                }
            }
        }

        static void GUANGGUN(int input)
        {
            var output = string.Join(Environment.NewLine, Enumerable
              .Range(input, 1)
              .Select(n => $"{Formula(n),1}"));

            Console.WriteLine(output);
        }
    }
}

但是,SPOJ说这是错误的答案。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您正在尝试解决XY problem。正如我们在最初的问题中看到的那样

https://www.spoj.com/problems/GUANGGUN/

n最多可以为1e18;这就是为什么

11....1 (n times) 
对于强力方法,

有点太长({1e18位数字是string中的1.7 PetaByte 大小)。实际上,您正在寻找A080151序列,代码为

private static long Solution(long n) => 81 * (n / 9) + (n % 9) * (n % 9);

演示:

using System.Linq;

...

var demo = string.Join(Environment.NewLine, Enumerable
  .Range(1, 15)
  .Select(n => $"{n,2} -> {Solution(n),3}"));

Console.Write(demo);

结果:

 1 ->   1
 2 ->   4
 3 ->   9
 4 ->  16
 5 ->  25
 6 ->  36
 7 ->  49
 8 ->  64
 9 ->  81 <- Example from the problem
10 ->  82 <- Example from the problem
11 ->  85
12 ->  90
13 ->  97
14 -> 106
15 -> 117

答案 1 :(得分:0)

如果我们谈论大量的输入,那么字符串确实会很痛苦 尽管有使用10的负幂的解决方案;

var Stopwatch = new Stopwatch();
        var input = Convert.ToInt32(Console.ReadLine());
        Stopwatch.Start();
        double res = 1.0;
        input = input * -1;
        for (int i = input; i < 0; i++)
        {
            res += Math.Pow(10, i);
        }
        Console.WriteLine(res);
        Stopwatch.Stop();
        TimeSpan ts = Stopwatch.Elapsed;

您会看到,每个下一位数字对应于输入绝对值的乘方 因此,对于4,您将获得1 + 0.0001 + 0.001 + 0.01 + 0.1