查找用户给出的n值的中位数,而不使用数组或使用数组或任何其他集合的任何函数

时间:2017-09-09 10:08:56

标签: java sorting math pseudocode median

仅允许对变量进行手动算法。列表,数组等集合不能使用。 (我在程序中使用了.length()函数,但可以通过在每次输入后放置一个空格并计算字符数来手动完成,直到找到空格为止。

1 个答案:

答案 0 :(得分:0)

使用数组解决的问题是存储用户输入的任意数量的值。这可以通过将值存储在字符串中来解决。由于我们必须知道要从字符串中选择多少个字符来形成数字,我还将数字的长度存储在一个单独的字符串中(长度通常只有1位数,所以我们&# 39; d肯定知道第n个数字的长度将在lengthstorage字符串中的第n个字符处。)

算法:

  1. 从字符串中取一个数字,然后从字符串中的每个其他数字中减去它。
  2. 如果结果为正,则在int' pos'中添加1;如果是否定的,则为“否定”;如果为零,则复制'。
  3. 如果输入了奇数个数字,则pos + copy> = n / 2和neg + copy> = n / 2的数字是中位数。
  4. 如果偶数个数字被输入,那么我们有2个中间数字fmedian和smedian,其平均值将是中位数。 (参考算法代码)。

  5. import java.util.Scanner;
    class Main {
      public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input,inputstorage,lengthstorage,inputlength;
        int nonrep=0;
        System.out.println("Enter the number of values");
        int n = sc.nextInt();
        int fmedian=0,smedian=0;
        System.out.println("Enter a value");
        input= sc.next();                                                                 //String
        inputlength = "" + (char)(input.length()+48);
        inputstorage = input;
        lengthstorage = inputlength;
        for (int i=1; i<n; i++)
        {
            System.out.println("Enter a value");
            input = sc.next(); 
            inputstorage = inputstorage + input;
            lengthstorage = lengthstorage + (char)(input.length()+48); 
        }                
    
        int mainnumpos = 0;
    
        for(int j=0;j<n;j++)
        {
          int copy=0;
          int mainnumlength = lengthstorage.charAt(j) - 48;
            int neg=0,pos=0;
            int mainnum = 0; int factor = 1;int mainnumsign = 0;
            for (int m =mainnumlength-1; m >= 0; m--)
            {
            if(inputstorage.charAt(mainnumpos+m)=='-')
            {
              mainnumsign = 1;
            }
            else
            {
            mainnum += (inputstorage.charAt(mainnumpos+m) - '0') * factor;
            factor *= 10;
            }
            }
            mainnumpos = mainnumpos + mainnumlength;
            if(mainnumsign==1)
            {
              mainnum = -mainnum;
            }
    
            int position = 0;
            for (int q=0;q<n;q++)
    
          { int fnumsign = 0;
    
    
          int fnumlength = lengthstorage.charAt(q) - 48;
    
            int fnum = 0;
            factor = 1;
            for (int l =fnumlength-1; l >= 0; l--)
            {
              if(inputstorage.charAt(position+l)=='-')
              {
                fnumsign = 1;
              }
              else{
            fnum += (inputstorage.charAt(position+l) - '0') * factor;
            factor *= 10;
              }
            }
            if(fnumsign==1)
            {
              fnum = -fnum;
            }
            if((mainnum-fnum)>0)
            {
              pos++;
            }
            else if((mainnum-fnum)<0)
            {
              neg++;
            }
            else{
              copy++;
                }
            position = position + fnumlength;
    
    
    
          }
    
          if((n%2)!=0){
    
         if((double)(pos+copy)>=((double)n)/2.0 && (double)(neg+copy)>=((double)n)/2.0)
         {
           if(nonrep==0)
           {
           System.out.println("The median is: "+ mainnum);
           nonrep++;
           }                           
         }
         }
         else
         {
           if ((double)(pos+copy)==(double)n/2.0) 
           {
             fmedian=mainnum;
           }
           else if((double)(neg+copy)==(double)n/2.0) 
           {
             smedian = mainnum;
           }
           else if((double)(pos+copy)>=(double)n/2.0 && (double)(neg+copy)>=(double)n/2.0  ) 
           {
             fmedian = mainnum;
             smedian = mainnum;
           }
           if(j==n-1){
             double evenmedian = ((double)(smedian + fmedian))/2.0;
           System.out.println("The median is: "+evenmedian);
           }
         }
        }
    
      }
    }