我怎么称呼这个方法.. +检查我的方法是否正确

时间:2012-02-23 10:52:34

标签: c# arrays console

昨晚我问了这个问题.. this link 和成员回答我(谢谢) 我有另一种方法让我觉得我有问题..

我会放两种方法..第二种是我要问的..

 public static bool ISprime(int prime)
    {

            if (prime < 2 )
                return false;
            else if (prime == 2)
                return true;
            else
            {
                for (int i = 2; i < prime; i++)
                {
                    if (prime % i == 0)
                        return false;
                }

                return true;
            }            
    }
     // second method
    public static int[] GeneratePrimes(int[] n)
    {
        int[] array = new int[n.Length];
        int PrimeLength =0;
        for (int i = 0; i < n.Length; i++) 
        {
            if (ISprime(array[i]))
                PrimeLength++;
        }

        int[] arprime = new int[PrimeLength];

        for (int i = 0, j=0; i< PrimeLength; i++)
        {
            if (ISprime(i))
                arprime[j++] = i;
        }
        return arprime;
    }
  1. GeneratePrimes这个方法正确..我想将所有素数放在一个名为arprime的数组中..
  2. 在汇编/程序中如何传递数字..用户类型如Console.ReadLine()
  3. 谢谢

4 个答案:

答案 0 :(得分:0)

不确定您的方法是否有效,但回答问题的第二部分:

string s = Console.ReadLine();
int n = Convert.ToInt32(s);
int[] arprimes = GeneratePrimes(n);

可能最好将转换位置于试验中,因为用户可以输入不是数字的内容。

编辑:实际上,我会将方法更改为GeneratePrimes(int n)而不是GeneratePrimes(int [] n) - 您不需要传递数字数组,只需传递数字,因为它返回一个数组。 / p>

另一个编辑:这里更改了您的方法,以便传递int而不是int数组。仍然不确定该方法是否会实际工作。

public static int[] GeneratePrimes(int n)
{
    int[] array = new int[n];
    int PrimeLength =0;
    for (int i = 0; i < n; i++) 
    {
        if (ISprime(array[i]))
            PrimeLength++;
    }

    int[] arprime = new int[PrimeLength];

    for (int i = 0, j=0; i< PrimeLength; i++)
    {
        if (ISprime(i))
            arprime[j++] = i;
    }
    return arprime;
}

以下是您想要的主要方法

public static void Main(I cannot remember what goes here!)
{
    string s = Console.ReadLine();
    int n = Convert.ToInt32(s);
    int[] arprimes = GeneratePrimes(n);
    string output = "";
    for (i=0; i<arprimes.Length;i++)
    {
        output += arprimes[i].ToString() + ", ";
    }
    output = output.Remove(output.Length - 3, 2);
    Console.WriteLine(output);
}

答案 1 :(得分:0)

如果你需要从1到n的所有素数,你需要有这样的东西:

int[] GeneratePrimes(int n)
{
   List<int> primes = new List<int>();
   for (int i=1; i<=n i++)
   {
      if (IsPrime(i))
      {
         primes.Add(i);
      }
   }

   return primes.ToArray();
}

但是这个算法并没有效果。见:http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes还有另一种筛子,更有效。

更新。如果您需要前n个素数,那么您需要执行以下操作:

int[] GeneratePrimes(int n)
{
   List<int> primes = new List<int>();

   while (primes.Length < n)
   {
      if (IsPrime(i))
      {
         primes.Add(i);
      }
   }

   return primes.ToArray();
}

答案 2 :(得分:0)

要回答你的第一个问题,我的理解是GeneratePrimes()将返回一个数组,该数组只有作为参数提供的数组中的素数。

您的方法无效,因为if (ISprime(array[i]))将始终失败,因为“array”未分配任何值。您必须改为使用if (ISprime(n[i]))

但是,您也可以避免两个循环执行相同的任务。以下代码可能会对您有所帮助:

public static int[] GeneratePrimes(int[] n)
{
   List<int> primeList = new List<int>();
   for (int i=0; i<n.Length; i++)
   {
      if(isprime(n[i]))
        primeList.Add(n[i]);
   }

   return primeList.ToArray();
}

答案 3 :(得分:0)

答案1: 你能做的是:

enter code here

public static int[] GeneratePrimes(int[] n)     
{         
     int[] array = new int[n.Length];  
     int[] arprime = new int[n.Length];    

     int PrimeLength =0;  
     int j=0;       
     for (int i = 0; i < n.Length; i++)          
     {             if (ISprime(array[i]))  
                   {
                         PrimeLength++;  
                         arprime[j++]=array[i];
                   }          
      }
      Array.Resize(ref arprime, PrimeLength);
      return arprime;     

}

答案2:

在命名空间中包含该程序集

AssemblyName.ClassName.MethodName(Int.Parse(到Console.ReadLine())); //用于传递整数数据otherwize不要强制转换