为什么不';所有整数到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
…
我犯了什么错误?这很奇怪,因为我只是用第一个程序制作了第二个,所以第二个程序没有理由不工作。。。
只是解决问题的另一种方法。
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;
是的,我知道,我真的需要学习如何使用调试器。。。