代码之家  ›  专栏  ›  技术社区  ›  Eonm

在不使用数组或任何使用数组或任何其他集合的函数的情况下,查找用户给定的n个值的中值

  •  0
  • Eonm  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   rene    7 年前

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

    算法:

    1. 从字符串中取一个数字,然后从字符串中每隔一个数字减去它。
    2. 如果输入奇数个数字,则pos+copy的数字>=n/2和neg+copy>=n/2是中值。
    3. 如果输入偶数个数字,那么我们将有两个中间数字fmedian和smedian,其平均值将是中值。(请参阅算法代码)。


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