问题是:设计并实现一个应用程序,该应用程序首先读取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++;
答案 0 :(得分:1)
提示:
答案 1 :(得分:1)
更多提示:
将问题概括为'计算字符串中的不同字符'。因为你无论如何都是以字符串形式读取输入,所以忘记你现在正在计算整数,并专注于计算字符串中的字符外观。
想想一个可以包含一对(不同的char,count)的数据结构。
遍历字符串中的字符,如果字符不存在且默认值为0,则将字符添加到数据结构中,然后增加您当前查看的字符数。
显示程序的输出时,遍历数据结构的条目,验证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
}