2014-11-06 2 views
-5

저는 C#의 초보자입니다.n까지의 정수를 모두 분해 할 수없는 이유는 무엇입니까?

n의 소수 분해를 계산하는 프로그램을 만들려고했습니다. 그리고 효과가있었습니다. 여기있다 :

Console.WriteLine("Write a number."); 

     int n = int.Parse(Console.ReadLine()); 

     bool[] p = new bool[(int)Math.Floor(Math.Sqrt(n))+2]; 

     for(int i=2; i<p.Length; i++) 
     { 
      p[i]=true; 
     } 

     for(int i=2; i<=Math.Sqrt(p.Length); i++) 
     { 
      if(p[i]) 
      { 
       for(int j=i*i; j<p.Length; j+=i) 
       { 
        p[j]=false; 
       } 
      } 
     } 

     int[] P = new int[p.Length]; 

     int k=0; 

     for(int i=2; i<p.Length; i++) 
     { 
      if(p[i]) 
      { 
       P[k]=i; 
       k++; 
      } 
     } 

     Array.Resize(ref P, k); 

     int N=n; 

     for(int i=0; i<P.Length; i++) 
     { 
      if(n%P[i]==0) 
      { 
       int j=1; 

       while(n%Math.Pow(P[i],j+1)==0) 
       { 
        j++; 
       } 

       if(n!=N) 
       { 
        Console.Write(" . "); 
       } 

       Console.Write(""+P[i]+"^"+j); 
       n/=(int)Math.Pow(P[i],j); 
      } 
     } 

     if(n!=1 && n!=N) 
     { 
      Console.Write(" . "+n+"^1"); 
     } 

     if(n==N) 
     { 
      Console.Write(""+n+"^1"); 
     } 

     Console.ReadKey(true); 

가 그럼 난 n까지 모든 정수의 소인수 분해를 계산하는 프로그램을 만들기 위해 노력했다. 그러나 그것은 효과가 없습니다. 여기있다 : 나는이 프로그램을 실행하면

Console.WriteLine("Write a number."); 

     int n = int.Parse(Console.ReadLine()); 

     bool[] p = new bool[(int)Math.Floor(Math.Sqrt(n))+2]; 

     for(int i=2; i<p.Length; i++) 
     { 
      p[i]=true; 
     } 

     for(int i=2; i<=Math.Sqrt(p.Length); i++) 
     { 
      if(p[i]) 
      { 
       for(int j=i*i; j<p.Length; j+=i) 
       { 
        p[j]=false; 
       } 
      } 
     } 

     int[] P = new int[p.Length]; 

     int k=0; 

     for(int i=2; i<p.Length; i++) 
     { 
      if(p[i]) 
      { 
       P[k]=i; 
       k++; 
      } 
     } 

     Array.Resize(ref P, k); 

     for(int m=2; m<=n; m++) 
     { 
      int M=m; 

      for(int i=0; i<P.Length; i++) 
      { 
       if(m%P[i]==0) 
       { 
        int j=1; 

        while(m%Math.Pow(P[i],j+1)==0) 
        { 
         j++; 
        } 

        if(m!=M) 
        { 
         Console.Write(" . "); 
        } 

        Console.Write(""+P[i]+"^"+j); 
        m/=(int)Math.Pow(P[i],j); 
       } 
      } 

      if(m!=1 && m!=M) 
      { 
       Console.Write(" . "+m+"^1"); 
      } 

      if(m==M) 
      { 
       Console.Write(""+m+"^1"); 
      } 

      Console.WriteLine(""); 
     } 

     Console.ReadKey(true); 

그냥 표시

2^1
2^1
2^1
2^1
...

어떤 오류가 있습니까? 두 번째 프로그램을 만들 때 방금 첫 번째 프로그램을 사용했기 때문에 이상합니다. 두 번째 프로그램이 작동하지 않을 이유가 없습니다 ...

+4

그리고 두 번째 교훈은 귀하의 변수 이름입니다. P, J, 나는 이해하기 어렵다. –

+1

그리고 세 번째 교훈은 코드를 메소드에 넣는 것입니다. 첫 번째 프로그램이 이미'N '을 입력하는 메서드를 갖고 있다면 두 번째 프로그램은 첫 번째 프로그램의 메서드를 호출하는 단순히 for 루프입니다. 첫 번째 프로그램이 작동하는 한 일할 수 없었습니다. (좋아, 나는 약간 과장된 ... 프로그래밍 언어는 전혀 바보가 아니다 ...하지만 초보 프로그래머조차도 깨뜨릴 수있다.) –

+0

@BillGregg "이해하기 힘듭니다"- 설명 (문서)없이. –

답변

2

당신의 문제에 대한 다른 접근법.

Console.WriteLine(FormatFactors(120)); 
Console.WriteLine(FormatFactors(7200)); 

출력 :

2^3 * 3 * 5 
2^5 * 3^2 * 5^2 

string FormatFactors(int n) 
{ 
    return String.Join(" * ", 
       Factors(n).GroupBy(x => x) 
         .Select(g => g.Key + (g.Count() > 1 ? "^" + g.Count() : "")) 
      ); 
} 

IEnumerable<int> Factors(int n) 
{ 
    int i=2; 
    while(i<=n) 
    { 
     if (n % i == 0) 
     { 
      yield return i; 
      n /= i; 
     } 
     else 
     { 
      i++; 
     } 
    } 
} 
+0

@jmorc 어쩌면 왼쪽과 3 upvotes 에이 녹색 눈금이 당신에게 뭔가 의미. – EZI

1

문제가 해결되었습니다.

for(int q=2; q<=n; q++) 
     { 
      int m=q; 

      int M=q; 

그리고이에

for(int m=2; m<=n; m++) 
    { 
     int M=m; 

:

문제는 루프의 내부 변화 변수 m의 값 ...

그래서 난 그냥이 수정이었다 그래, 나도 알아, 난 정말 디버거를 사용하는 방법을 배울 필요가 ...

+0

실제로 우리 중 대부분은 자신이 쓴 책에 달린 것을 잊어 버렸습니다. 솔직히 말해서. 코드를 읽는 중 디버거 없이는 오류를 찾을 수 없습니다. 더 읽기 쉽고 중요한 변수 이름과 주석을 사용하는 것이 좋습니다. 당신은 그것을 후회하지 않을거야 :) – user2888973

관련 문제