java 新手问题 为什么c里总是0

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 = (int)b/(int)e;”这一行中,你定义的c是int,但是输入的数值没有e的数值大,导致除后的结果只保留整数位

因为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了