materials = (0..9).to_a
result = 0
(0..5).each{|i| result += materials.delete_at(rand(materials.size))* 10**i }
puts result%10000

再省两行代码的实现是:

materials = (0..9).to_a
puts (0..5).inject(0){ |n,i|  n + materials.delete_at(rand(materials.size)) * 10**i } % 10000

思路跟昨天Ttrail说的一样。
用一个数组 materials = (0..9).to_a 存放可以取的数,循环从里面随机取,取完就从数组中删除。
为了保证千位数不是0,我没有特意判断,而是多循环了一次(5次),将最终结果 % 10000截到。
每次的随机数在 0至数组.size之间(不包括),即能随机取到一个合法的组数索引。

– 后记:对一个五位数取模10000就能得到四位数?我真蠢~


3条评论

  1. 你的代码自己测试过没有啊?呵呵。

    (0..5).inject语法错

    另外你多循环一次也没有避免首位是0的情况。

  2. 1. (0..5).inject语法错

    2. 循环5次并没有避免首位为0的情况

  3. Random rand=new Random();

    int[] a=new int[10];

    int n=0;

    while(n<10){

    int num=rand.nextInt(11);

    int plag=0;

    for(int i=0;i<=n;i++){

    if(a[i]==num) break;

    if(i==n) plag++;

    }

    if(plag==1 && num!=0){

    a[n]=num;

    n++;

    }

    }

    for(int i=0;i<a.length;i++){

    System.out.println("a["+i+"]="+a[i]);

    }

发表评论

评论也有版权!