2016-04-14 8 views
-2

プロジェクトオイラーchallenge 23状態この:プロジェクトオイラー#23

完全数は、その適切な約数の合計が数と正確に一致しているため数です。例えば、28の適切な約数の和は、1 + 2 + 4 + 7 + 14 = 28であり、これは28が完全な数であることを意味する。

数値nは、その適切な約数の合計がnより小さい場合は不完全と呼ばれ、この合計がnを超える場合は豊富と呼ばれます。

12は、1 + 2 + 3 + 4 + 6 = 16の最小の豊富な数であり、2つの豊富な数の合計として書くことができる最小の数は24です。数学的分析により、 28123より大きいすべての整数は、2つの豊富な数の合計として記述することができます。ただし、2つの豊富な数の和で表現できない最大の数がこの制限よりも小さいことがわかっていても、この上限を分析することで、これ以上の低減はできません。

2つの豊富な数値の合計として記述できないすべての正の整数の合計を求めます。

だから私はこの作業を取得しようとしている、しかし、私は間違った結果を取り戻す維持してきた、私は私が持っているけれども、これはコードに間違っている場合はわからない:

static void Main(string[] args) 
    { 
     List<int> abundantNums = Enumerable.Range(12, 1000000).Where(i => isAbundant(i)).ToList(); 
     abundantNums = abundantNums.Distinct().ToList(); 

     var boolArr = new bool[28124];   

     for (int i = 0; i < abundantNums.Count; ++i) 
     { 
      for (int j = i; j < abundantNums.Count; ++j) 
      { 
       var sum = abundantNums[i] + abundantNums[j]; 
       if (sum < 28124) boolArr[sum] = true; 
       else break; 
      } 
     } 


     var total = 0; 
     for (int i = 0; i < boolArr.Length; i++) 
     { 
      if (boolArr[i] == false) 
      { 
       total += i; 
      } 
     } 

     Console.WriteLine(total); 
     Console.ReadKey();   
    } 

    static bool isAbundant(int num) 
    { 
     if (getFactors(num).Sum() > num) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

そして、数値の要因を見つけるために私が持っている:私より

static List<int> getFactors(int num) 
    { 
     List<int> factors = new List<int>(); 
     Stopwatch watch = Stopwatch.StartNew(); 
     for (int i=1; i < Math.Sqrt(num) + 1; i++) 
     { 
      if (num % i == 0) 
      { 
       factors.Add(i); 
       if (num/i != i) 
       { 
        factors.Add(num/i); 
       } 
      } 
     } 
     watch.Stop(); 
     factors.Remove(num); 
     return factors; 
    } 

、私は一日か二日のためにこれをしてきたし、私の知る限り、これはトリックを行うべきである、誰も賢く私の失敗を指摘できますか?

+1

また、問題文を述べてください。 –

+1

どのような結果が得られ、何を期待しましたか? – BugFinder

+0

4178816私が得ている結果ですが、正しい答えがわからないので、私は何を期待しているのか分かりません。これは間違っているということを知っています。 – Coombes

答えて

1

問題はgetFactorsループです。変更:

for (int i=1; i <= Math.Sqrt(num); i++) 

for (int i=1; i < Math.Sqrt(num) + 1; i++) 

そして、それは動作するはずです。私はあなたに試してみましょう理由:-)

+0

それでも出力は変わりました私の新しい結果は間違っています – Coombes

+0

@Coombesは私のために働きます:[それをチェック](https://dotnetfiddle.net/SjXM19)...あなたは何の結果を期待していますか? '4179871'が正しい結果になるはずです – Jcl

関連する問題