添加while和for循环

时间:2011-04-16 06:56:13

标签: java sorting

问题是:设计并实现一个应用程序,该应用程序首先读取10个三位整数的列表,然后计算从0到9的每个数字的出现次数。

以下是3个三位数字的示例
输入数字[123,456,789]
输出:
数字0出现了0次 数字1出现了1次 数字2出现了1次 ...
数字9出现了1次

我相信我已经找到了计算每个数字出现次数的正确公式,但我不知道如何创建数组并开始搜索它。我想我需要一段时间和一个for循环,但我不知道如何合并它们。但是,我担心,一旦实现循环,我的当前if语句将需要更改。我在这里朝着正确的方向前进吗?任何帮助将不胜感激!

double i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
int c0=0, c1=0, c2=0, c3=0, c4=0, c5=0, c6=0, c7=0, c8=0, c9=0;

Scanner scan = new Scanner(System.in);

System.out.println ("Enter 10 3-digit integers");

//Counts the 1st number
System.out.println ("Enter first 3-digit integer");
i1 = scan.nextDouble();

    if (i1%10==0)
    c0++;
    if (i1%10==1)
    c1++;
    if (i1%10==2)
    c2++;
    if (i1%10==3)
    c3++;
    if (i1%10==4)
    c4++;
    if (i1%10==5)
    c5++;
    if (i1%10==6)
    c6++;
    if (i1%10==7)
    c7++;
    if (i1%10==8)
    c8++;
    if (i1%10==9)
    c9++;

    if ((i1%100>=0) & (i1%100<10))
    c0++;
    if ((i1%100>=10) & (i1%100<20))
    c1++;
    if ((i1%100>=20) & (i1%100<30))
    c2++;
    if ((i1%100>=30) & (i1%100<40))
    c3++;
    if ((i1%100>=40) & (i1%100<50))
    c4++;
    if ((i1%100>=50) & (i1%100<60))
    c5++;
    if ((i1%100>=60) & (i1%100<70))
    c6++;
    if ((i1%100>=70) & (i1%100<80))
    c7++;
    if ((i1%100>=80) & (i1%100<90))
    c8++;
    if ((i1%100>=90) & (i1%100<100))
    c9++;


    if((i1/1000>=.0) & (i1/1000<.1))
    c0++;
    if((i1/1000>=.1) & (i1/1000<.2))
    c1++;
    if((i1/1000>=.2) & (i1/1000<.3))
    c2++;
    if((i1/1000>=.3) & (i1/1000<.4))
    c3++;
    if((i1/1000>=.4) & (i1/1000<.5))
    c4++;
    if((i1/1000>=.5) & (i1/1000<.6))
    c5++;
    if((i1/1000>=.6) & (i1/1000<.7))
    c6++;
    if((i1/1000>=.7) & (i1/1000<.8))
    c7++;
    if((i1/1000>=.8) & (i1/1000<.9))
    c8++;
    if((i1/1000>=.9) & (i1/1000<1.00))
    c9++;

4 个答案:

答案 0 :(得分:1)

提示:

  1. 删除所有c<n>i<n>声明以及所有if测试。它们无法帮助您解决问题。
  2. 利用'0' + <n> == '<n>' <n>0 .. 9的事实。
  3. 或使用Character.digit(char, 10)。阅读javadocs
  4. 您不使用nextDouble()来读取整数。阅读javadocs

答案 1 :(得分:1)

更多提示:

  1. 将问题概括为'计算字符串中的不同字符'。因为你无论如何都是以字符串形式读取输入,所以忘记你现在正在计算整数,并专注于计算字符串中的字符外观。

  2. 想想一个可以包含一对(不同的char,count)的数据结构。

  3. 遍历字符串中的字符,如果字符不存在且默认值为0,则将字符添加到数据结构中,然后增加您当前查看的字符数。

  4. 显示程序的输出时,遍历数据结构的条目,验证char是否为整数(如果验证很重要),并返回该char的计数。

    < / LI>

    我不确定你是否遇到迭代问题,但这里是如何遍历字符串的字符:

    String s = "123 456 789";
    
    for (int i = 0; i < s.length(); i++){
        char c = s.charAt(i);
        // process c
    }
    
    // or, if you know what 'smart loops' in Java are...
    
    for(char c : s.toCharArray()) {
        // process c
    }
    

    为了混淆事情,这里是......'伪代码'(根据评论编辑);)

    >>> s = "012 345 678 900"
    >>> datastructure = {}
    >>> for c in s:
    ...     if c not in datastructure:
    ...         datastructure[c] = 0
    ...     datastructure[c] += 1
    ... 
    >>> for c in '0123456789':
    ...     if c not in datastructure:
    ...         datastructure[c] = 0
    ...     print 'Digit %s appeared %d times' % (c, datastructure[c])
    ... 
    Digit 0 appeared 3 times
    Digit 1 appeared 1 times
    Digit 2 appeared 1 times
    Digit 3 appeared 1 times
    Digit 4 appeared 1 times
    Digit 5 appeared 1 times
    Digit 6 appeared 1 times
    Digit 7 appeared 1 times
    Digit 8 appeared 1 times
    Digit 9 appeared 1 times
    

答案 2 :(得分:1)

你的想法并不那么糟糕,你显然需要一些循环:)

1:循环获取数字 - 你不能复制相同的代码10x - 在循环中写一次。

2:循环检查数字 - 你可以使用你的if,或者按 Josh 表示 但之前 - 您需要数据结构来存储您的数据 - 出现数字。 10个变量很糟糕,BAD :),想法。
使用array[2][10]或简单array[10](其中位数=数组索引和值=发生)或更好 - HashMap<> - google it

然后在内循环中执行:

for(int i = 0; i<10; i++){
    if (myCurrentNumberToCheck %10 == i)
        array[i] = array[i] + 1; // approach with simple array[10]
    if ((myCurrentNumberToCheck %100 >= i*10) && (myCurrentNumberToCheck %100 < (i+1)*10 )) // needs to be tested
        array[i] = array[i] + 1;
    if ((myCurrentNumberToCheck %1000 >= i*100) && (myCurrentNumberToCheck %1000 < (i+1)*100 )) // needs to be tested
        array[i] = array[i] + 1;
}

啊,你插入的数字也应该是某种结构 - 在这里尝试List numbers = new ArrayList<int>() :)并迭代你的列表,看看下一个数字。

所以你需要在List中添加数字,接下来 - 去你那个列表并检查它们,然后在这里使用我上面写的那个循环

答案 3 :(得分:0)

readInt()和readDouble()的问题在于它忽略了前导0并在小数后跟踪0,即01.10 =&gt; 1.1

更简单的方法是阅读每个角色。

  int ch;
  while((ch = System.in.read())>=0) {
      // you have one character

  }