package com.cyx.ex;
import java.util.Scanner;
public class Appea {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("请输入一个16位长整形数:");
Scanner a = new Scanner(System.in);
int i = 0;
double d = 10;
long b = a.nextLong();
//String str = String.valueOf(b);
int array[] = new int[10];
for(;i < 16 ; i++){
//int c = ((byte)str.charAt(i)) - 0x30;、
int c = 0;
for(double j = 15;j >= 1 ;j--){
double e = 0;
e = Math.pow(d, j);
c = (int)b/(int)e;
b = b % (long)e;
System.out.println(c);
switch(c){
case 0:
array[0]++;
break;
case 1:
array[1]++;
break;
case 2:
array[2]++;
break;
case 3:
array[3]++;
break;
case 4:
array[4]++;
break;
case 5:
array[5]++;
break;
case 6:
array[6]++;
break;
case 7:
array[7]++;
break;
case 8:
array[8]++;
break;
case 9:
array[9]++;
break;
default:
System.out.println("输入的数值非法 请重新输入!");
break;
}
}
for(i = 0;i < 11; i++){
System.out.println("输入的数字中" + i + "出现的次数为:" + array[i]);
}
}
}
}
你把long和double强转为int是不对的,调试一下就会发现了c = (int)b/(int)e;这句是问题的关键。
还有就是问问题的时候先说明你要干啥再贴程序,看了你最后一行才知道你要求一个16位数中各个数字出现的次数,哎。
你的程序中写了两个for循环是多余的,一个循环就能搞定了。直接看下面的代码吧:
public static void main(String[] args) {
System.out.println("请输入一个16位长整形数:");
Scanner a = new Scanner(System.in);
long b = a.nextLong();
int array[] = new int[10];
for (int i = 0; i < 16; i++) {
// 高位到低位依次遍历求商即可
double e = Math.pow(10, 15 - i);
int c = (int) (b / (long) e);
switch (c) {
case 0:
array[0]++;
break;
case 1:
array[1]++;
break;
case 2:
array[2]++;
break;
case 3:
array[3]++;
break;
case 4:
array[4]++;
break;
case 5:
array[5]++;
break;
case 6:
array[6]++;
break;
case 7:
array[7]++;
break;
case 8:
array[8]++;
break;
case 9:
array[9]++;
break;
default:
System.out.println("输入的数值非法 请重新输入!");
break;
}
// 修改b的值
b = b % (long) e;
}
for (int i = 0; i < 10; i++) {
System.out.println("输入的数字中" + i + "出现的次数为:" + array[i]);
}
}
因为c定义在for循环里,作用域就在这块。
每循环一次,c总是被初始化为0;
double e也是如此。
e = Math.pow(d, j); pow()表示d的j次方
c = (int)b/(int)e;当b每次都不及e大的时候,c表示商,为0
因为b是余数 c=e/比e大的数 所以c一直等于0;
因为b<e
所以b/e<1
又因为c=b/e,且c为整形
所以c=0;
import java.util.Scanner;
public class Appea {
/**
* @param args
*/
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
System.out.println("请输入一个16位长整形数:");
int array[] = new int[10];
byte[] bytes = scanner.next().getBytes();
for (byte c : bytes) {
int value = c - 48;
array[value]++;
}
for (int j = 0; j < 10; j++) {
System.out.println("输入的数字中" + j + "出现的次数为:" + array[j]);
}
}
}
}
因为b<e
所以b/e<1
又因为c=b/e,且c为整形
所以c=0;
因为b<e
所以b/e<1
又因为c=b/e,且c为整形
所以c=0;
除法只保留整数,b/e 第一次循环的后 pow(d,j)都有10^15了