这样的一个算法,有一个浮点数组作为参数。我要对这个浮点数组进行转换,按照比例转换为0-200之间的整数。如一组这样的数:1000,3500,2000    转换后为:10,50,20
或者一组这样的数:1.5,2.3,7.62    转换后为:15,23,76
求算法,最好给出源程序代码,谢谢谢谢!还有一个算法是,要将他们转换为0-6之间的整数,快下班了,我不走。在线等着给分。谢谢大家!!!!!

解决方案 »

  1.   

    第一条的规律:其实我也总结的不太准确,我的理解就是让所有的数字按比例缩放,让结果最终控制在1-200之间,但缩放的要求就是,在保证所有结果都在此范围的情况下,尽量还原真实的变化规律,就是线图的点的需求。  给的数据,在线图上按照固定的x,y轴呈现,x和y是固定的,不能变。
      

  2.   

    哦 
    那像素一般都是2000左右就够了吧你试试这样,先把所有的数乘以10然后把所有数 强制转换成 int然后试下取平均值和100比较进行确认倍率要么就用最大值和最小值 我下了  哈哈  也期待高手解决明天来观望
      

  3.   

    首先确定是要扩大还是缩小  ,找到最大的数,大于200的就应该是缩小,反之扩大。
    然后就是怎么扩大或者缩小,
    扩大,先数组每个元素*10,然后判断时候满足条件(可以写成函数调用),不行继续扩大,可以while(满足否)
    {
       *10;
    }缩小也是一样的
      

  4.   


     List<decimal> listDecimal = new List<decimal>();
                listDecimal.Add(1000M);
                listDecimal.Add(3500M);
                listDecimal.Add(2000M);            Queue<List<decimal>> quelist = new Queue<List<decimal>>();
                quelist.Enqueue(listDecimal);
                while (quelist.Count > 0)
                {
                    decimal num = -1;
                    List<decimal> templist = quelist.Dequeue();
                    decimal minvalue = templist.Min();
                    decimal maxvalue = templist.Max();
                    if (minvalue >= 100) { num = 0.1M; }
                    else if (10 <= minvalue && maxvalue > 200)
                    {
                        num = 0.1M;
                    }
                    else if (0 <= minvalue && maxvalue <= 10 && maxvalue<=20)
                    {
                        num = 10M;
                    }
                    if (num > 0)
                    {
                        for (int i = 0; i < templist.Count; i++)
                        {
                            templist[i] = templist[i] * num;
                        }                    quelist.Enqueue(templist);
                    }
                }            for (int i = 0; i < listDecimal.Count; i++)
                {
                     listDecimal[i] = decimal.Truncate(listDecimal[i]);
                     if (listDecimal[i] > 200) { listDecimal[i] = 200; }
                }
      

  5.   

    好像数学里的反正切函数或反双曲正切函数具有这样的性质,把无限大的区间影射到有限区间int f(int x)
    {
       return arctan(x)*200/pi+100;
    }
      

  6.   

    楼上楼上楼上的 独孤求败,写的还是根据最大值最小值求一个NUM事实上我觉得这个可以用这样的方式也行吧如果所有数0 < allNum <200 
    如果是这样的数 ,那么直接格式话成INT,小数位四舍五入,如果有两个数介于【0,200】之间另外一个大于200的话 ,且另外两个介于【0,99】
    直接把  greatNum == 200 如果有两个数介于【0,200】之间另外一个大于200的话,且另外两个介于【100,200】
    把greatNum /10 并且另外两个也 /10得到的数再格式花成INT
    这个时候再把得到的数进行初始判断即第一步这样一步步列出来把你想要的数据都想出来,可能的数据都想出来
    这个算法应该就成了 ,,,
    太笨了  
    继续观望高手吧
      

  7.   

    感谢:独孤求败 和 ruanwei1987,已经积极帮忙的各位。结合了两位的思想,我想了这样一个算法。1、先将数组×100并取整,得到一个整数的数组。
    2、计算数组中的介于0-200直接的数字的个数,如果大于等于数组的count/2就返回数组。
    3、如2为否,将数组/10得到新数组,重复2和3的操作。
    4、将最终数组中大于0的数字,改为200,小于0的数字改为0(其实没有小于零的数字,因为已经取整了。)这样就取消了×10或/10的判断,先放大,然后逐步缩小,循环/10.直到满足条件为止。大家再帮忙看看这种算法有什么不足。