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