【計算[0..N]各數數字出現的頻率】
給定一個n位正整數a,比如a=2147483647,對其中各個數位上出現的數字按0~9分別計數(也可稱之為出現頻次),用 表示。則a=2147483647的計數結果如下所示:
如果給定一個正整數P,對其中[0,P]的每個整數都按上述方式對數字0~9出現的頻次進行計數。就可以得到[0,P]內所有數中0~9出現的總次數,進一步可以計數0~9出現的頻率。
注意:整數前面的0,不計入0的出現頻次,前綴0對于整數沒有意義,即0123,直接寫成123。
例如P=10,則[0,10]內出現的數是0,1,2,3,4,5,6,7,8,9,10,其中0和1各出現2次,2~9各出現1次。
請使用回圈編程求出P=Integer.MAX_VALUE;(即P=2147483647),在[0,P]范圍內的數中0~9各數字出現的頻次和頻率。
要求:暫時不用陣列等其他結構,直接使用一組變數。
uj5u.com熱心網友回復:
不用陣列?其實有規律的,可以不用回圈,非要用回圈,效率比較低public class Sample {
public static void main(String[] args) {
long n0=0, n1=0, n2=0, n3=0, n4=0, n5=0, n6=0, n7=0, n8=0, n9=0;
double sum = 1; //總出現次數
n0++; //統計0出現過
for(int i=1; i<Integer.MAX_VALUE; i++) { //從1開始i回圈
int j=i;
while (j>0) {
switch(j%10) {
case 0: n0++; break;
case 1: n1++; break;
case 2: n2++; break;
case 3: n3++; break;
case 4: n4++; break;
case 5: n5++; break;
case 6: n6++; break;
case 7: n7++; break;
case 8: n8++; break;
case 9: n9++; break;
}
}
j /= 10;
sum++;
}
System.out.printf("0-9出現總頻次:%.0f\n", sum);
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 0, n0, n0*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 1, n1, n1*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 2, n2, n2*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 3, n3, n3*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 4, n4, n4*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 5, n5, n5*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 6, n6, n6*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 7, n7, n7*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 8, n8, n8*100/sum, "%");
System.out.printf("%d出現的頻次:%d, 出現的頻率:%.4f%s\n", 9, n9, n9*100/sum, "%");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168238.html
標籤:Java相關
上一篇:深入理解堆
