public class CollatzConjexture
{
public static int Calculate(int StartIndex, int MaxSequence)
{
int ChainLength = 0;
int key = 0;
bool ContinuteCalulating = true;
int LongestChain = 0;
Int64 Remainder = 0;
for (int i = StartIndex; i <= MaxSequence; i++)
{
ChainLength = 1;
Remainder = i;
ContinuteCalulating = true;
while (ContinuteCalulating)
{
Remainder = CalculateCollatzConjecture(Remainder);
if (Remainder == 1)
ContinuteCalulating = false;
ChainLength += 1;
}
if (ChainLength > LongestChain)
{
LongestChain = ChainLength;
key = i;
}
}
return key;
}
private static Int64 CalculateCollatzConjecture(Int64 Number)
{
if (Number % 2 == 0)
return Number/2;
else
return (3 * Number) + 1;
}
}
yerine .NET 4.0 Parallel.For kullanmak için: Ben Ben bir his var
int ChainLength = 0;
int key = 0;
bool ContinuteCalulating = true;
int LongestChain = 0;
Int64 Remainder = 0;
int[] nums = Enumerable.Range(1, 1500000).ToArray();
long total = 0;
// Use type parameter to make subtotal a long, not an int
Parallel.For<int>(1, nums.Length,() => 1, (j, loop, subtotal) =>
{
Remainder = j;
while (ContinuteCalulating)
{
Remainder = CalculateCollatzConjecture(Remainder);
if (Remainder == 1)
ContinuteCalulating = false;
ChainLength += 1;
}
if (ChainLength > LongestChain)
{
LongestChain = ChainLength;
key = j;
}
return key;
},
(x) => Interlocked.Add(ref key, x)
);
ondan çok uzak değil, ünlü son sözler.
Şimdiden teşekkürler.
Bunu çalıştırdığımda, en uzun Collatz zincirini (yani 1 - 1500000, seri yöntemi 1117065 ve LINQ yöntemi 1126015 döndüren en küçük dizini almam gerekir. Her ikisi de 528 zincir uzunluğundadır.). Sadece LINQ öğrenirken, bunu düzeltmek için '.Aggregate' çağrısını değiştirmenin basit bir yolu var mı? – chezy525
Her iki yanıtı da, her nasılsa, hata ayıkladığımda (1117065, 1126015) ayrı durumlar için alıyorum. İdeal olarak, minimum endeksi istiyorum. Şimdiden teşekkürler. – Seany84
Bunun için biraz uğraştıktan sonra, ".Aggregate" deki koşul deyimini değiştirmeniz gerektiğini düşünüyorum. "max.len cur.key) ' –
chezy525