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

C# 如何在不使用字符串的情况下创建/读取具有特定小数的数字?,c#,algorithm,C#,Algorithm,我正在尝试解决以下SPOJ问题: 问题是,我不知道如何正确地创建一个带有特定小数的数字(例如:如果将4输入到控制台,它将创建1.1111,或者如果输入8:1.11111111)。我试图用strings来做,但它超过了这个问题的惩罚时限 但即使这样,我也不知道如何在不使用变量[x]的情况下读取特定位置的小数 非常感谢您的帮助 编辑: 我已输入以下代码作为解决方案: using System; using System.Linq; using System.Collections; namesp

我正在尝试解决以下SPOJ问题:

问题是,我不知道如何正确地创建一个带有特定小数的数字(例如:如果将
4
输入到控制台,它将创建
1.1111
,或者如果输入
8
1.11111111
)。我试图用
string
s来做,但它超过了这个问题的惩罚时限

但即使这样,我也不知道如何在不使用
变量[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);
        }
    }
}
然而,斯波吉说这是一个错误的答案。有什么想法吗?

你想解决的问题。正如我们在最初的问题中所看到的

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

11....1 (n times) 
对于暴力方法来说有点太长(
1e18
数字是
字符串,大小为
1.7
PetaByte)。实际上,您正在查找序列,代码是

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
结果:

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->1
2 ->   4
3 ->   9
4 ->  16
5 ->  25
6 ->  36
7 ->  49
8 ->  64
9 ->  81   82   85
12 ->  90
13 ->  97
14 -> 106
15 -> 117

如果我们谈论大输入,字符串将非常痛苦 虽然用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;
var Stopwatch=new Stopwatch();
var input=Convert.ToInt32(Console.ReadLine());
秒表。开始();
双精度=1.0;
输入=输入*-1;
for(int i=输入;i<0;i++)
{
res+=数学功率(10,i);
}
控制台写入线(res);
秒表;
TimeSpan ts=秒表。已用时间;
你们看,每一个下一个数字对应一个更小的输入绝对值的幂
因此,对于
4
,您将得到
1+0.0001+0.001+0.01+0.1

您要查找的给定
n
的总和是
81*(n/9)+(n%9)*(n%9)
其中
//code>是整数除法,
%
余数如果
n
达到
1e18
,则应使用
,not
int
我已经测试了我在编辑本主题的主要帖子时添加的代码,但是SPOJ认为这是一个错误的答案。我做错了什么?