We need to generate random numbers within a certain digit range with few restrictions
e.g. For double digit range 11 - 99, the resultant output should not include all like numbers [11,22,33,44,...99] and multiples of 10 [20,30,40....90]
The resultant output should be [12,13,14,15,16,17,18,19,21,23,...98]
注意:此功能也可以无缝地用于其他数字范围(例如,跨越101 - 999的3位数范围和跨越1001 - 9999的4位数范围)
我们在识别相同数字方面遇到困难(例如11,22,33,44,55,66,77,88,99,111,222,333,......,3333 ......)
EDIT1:
protected static List<Integer> fetchRandIntegers(int min, int max, int howMany, boolean randomize) {
// We need to reverse minimum, maximum values for negative ranges
if (min > max) {
int tmp = min;
min = max;
max = tmp;
}
List<Integer> allNumbers = new ArrayList<Integer>();
for (int i = min; i <= max; i++) {
allNumbers.add(i);
}
if (randomize) {
...
}
return allNumbers;
}
答案 0 :(得分:3)
两个简单的选择:
后者可能更有效(你不会循环生成然后丢弃的数字),但实现起来会更复杂。
编辑:这是检查整数中所有数字是否相同的方法:
public boolean checkForAllOneDigit(int value)
{
int digit = value % 10;
value = value / 10;
while (value > 0)
{
if (value % 10 != digit)
{
return false;
}
value = value / 10;
}
return true;
}
(可能有一种稍微优雅的方式来编写循环,但我还没有咖啡......“modulo 11或111或1111等”方法也非常整洁。)
答案 1 :(得分:3)
确定整数i
是否所有数字都相同:
i
转换为string
并比较字符或有类似的东西:
public boolean hasAllDigitsSame (int i)
{
int a = i ;
int m = a % 10 ;
int mm = m ;
while(a > 0)
{
m = a % 10;
if (m != mm)
return False ;
a /= 10 ;
}
return True ;
}
确定整数i
是10
(100,1000)的倍数:
i modulo 10
是否为0
。答案 2 :(得分:2)
该程序也将给出答案
import java.util.*;
public class Generate {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("\nEnter the limit:");
int k = scan.nextInt();
int i,j,w,l,q,d;
for(i=13;i<=k;i++)
{
j=i%10;
if(j!=0)
{
if(i<99)
{
for(w=1;w<=9;w++)
{
l=11*w;
if(l==i)
{
i++;
continue ;
}
}
}
if(i>99)
{
for(q=1;q<=9;q++)
{
d=111*q;
if(d==i)
{
i++;
continue ;
}
}
}
System.out.println(i);
}
}
}
}
我知道这个程序很大,只是为了给出一个想法,我已经给出了这个。但我相信它会给出正确的答案!!
答案 3 :(得分:0)
您愿意使用多大的查找表? (将连续范围映射到没有禁用值的较大范围。)
或者你的支票(如果低于100,10和11的倍数,如果低于111和100的1000倍,依此类推),如果鱼太小则扔掉它?