为什么不';所有整数到n的素数分解都有效

本文关键字:分解 有效 整数 为什么不 | 更新日期: 2023-09-27 18:29:31

我是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

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

为什么不';所有整数到n的素数分解都有效

只是解决问题的另一种方法。

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++;
        }
    }
}

问题已解决。

问题是变量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;

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