【发布时间】:2011-11-10 08:44:56
【问题描述】:
这是相当“数学问题”,但我在这里发帖是因为这是一个 Project Euler 问题,而且我的工作代码可能存在错误。
问题Determing longest repeating cycle in a decimal expansion 使用对数解决问题,但我有兴趣用简单的蛮力解决问题。更准确地说,我有兴趣了解为什么我的算法和代码没有返回正确的解决方案。
算法很简单:
- 复制“长除法”,
- 在每一步记录除数和余数
- 当一个除数/余数元组重复时,推断十进制表示会重复。
这里是私有字段,根据要求
private int numerator;
private int recurrence;
private int result;
private int resultRecurrence;
private List<dynamic> digits;
这里是代码:
private void Go()
{
foreach (var i in primes)
{
digits = new List<dynamic>();
numerator = 1;
recurrence = 0;
while (numerator != 0)
{
numerator *= 10;
// quotient
var q = numerator / i;
// remainder
var r = numerator % i;
digits.Add(new { Divisor = q, Remainder = r });
// if we've found a repetition then break out
var m = digits.Where(p => p.Divisor == q && p.Remainder == r).ToList();
if (m.Count > 1)
{
recurrence = digits.LastIndexOf(m[0]) - digits.IndexOf(m[0]);
break;
}
numerator = r;
}
if (recurrence > resultRecurrence)
{
resultRecurrence = recurrence;
result = i;
}
}}
当测试整数 i 的值。但是,我得到的十进制表示不正确 - 我计算 i-1 而正确的结果要少得多(类似于 i-250)。
所以大概我有一个编程错误 - 我找不到 - 或者一个逻辑错误。
我很困惑,因为它对我来说就像multiplicative group over p,其中会有 p-1 个元素。我确定我错过了什么,有人可以提供建议吗?
编辑
我不会包含我的素数代码 - 这不相关,正如我在上面解释的那样,我正确识别了 i 的值(从内存中它是 983),但是我在获取正确的值时遇到了问题resultRecurrence.
【问题讨论】:
-
您能告诉我们您使用哪种语言编写代码吗?我以为是javascript,然后意识到不可能。
-
@Phil - 添加了 c# 标签 - 这不是 c# 特定的问题,但我想标签属于。
-
你能发布整个代码,其中变量
primes、digits、numerator、recurrence、resultRecurrence和result被声明了吗?如果这些是方法的参数,请向我们展示方法签名以及如何调用它。 -
你有什么理由使用弱类型的
List? -
@Kirk
dynamic是使用反射的便捷快捷方式。这在与 IronPython 等动态语言/库交互时是必需的。