为什么我的所有整数的素数因子分解不到n?

时间:2014-11-06 19:19:21

标签: c# c#-4.0 primes prime-factoring

我是C#的初学者。

我尝试创建一个计算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
  ...

我犯了什么错误?这很奇怪,因为我刚用第一个程序来制作第二个程序,所以第二个程序没有理由不工作......

2 个答案:

答案 0 :(得分: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++;
        }
    }
}

答案 1 :(得分:1)

问题解决了。

问题是变量m的值在for循环中发生了变化......

所以我刚修改了这个:

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

进入这个:

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

            int M=q;

是的,我知道,我真的需要学习如何使用调试器......