我正在尝试执行以下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说这是错误的答案。有什么想法吗?
答案 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