输入包括一个整数n(1 ≤ n ≤ 1,000,000,000)
输出包括一行10个整数,即0~9这些数字在页码中出现的次数,以空格分隔。行末无空格。
999
189 300 300 300 300 300 300 300 300 300
import java.util.*; public class Main { public static void main(String[] ags) { Scanner in = new Scanner(System.in); long n = in.nextLong(); in.close(); long[] numbers = new long[11]; long i =0; for( i=1; n/i!=0;i=i*10) { for(int j=1; j<10;j++) { /** *(n%(i*10))/i 是计算当前位置上的数,看前面同学的算法,分别计算before,current,after似乎更容易 */ if(j<((n%(i*10))/i)) { numbers[j]=numbers[j]+(n/(i*10) + 1)*i; } else if(j==((n%(i*10))/i)) { numbers[j]=numbers[j]+(n/(i*10))*i+n%i+1; } else numbers[j]=numbers[j]+(n/(i*10))*i;; } if(((n%(i*10))/i)==0) { numbers[0]=numbers[0]+(n/(i*10)-1)*i+n%i+1; } else { numbers[0]=numbers[0]+(n/(i*10))*i; } } for(int j =0; j<9; j++) { System.out.print(numbers[j] + " "); } System.out.print(numbers[9]); } }就这么个题,从早上写到晚上,脑子里像一团浆糊
不确定有没有bug, 例子上的输出通过。有点儿动态规划的意思, 每遇到一个数字,把每一位提取出来,累加到该数字之前的结果上。 看了其他人的回答,测试 900000000,输出为 708888897 820000000 820000000 820000000 820000000 820000000 820000000 820000000 820000000 720000001
public static void calculate(int n) { int[] numbers = new int[10]; for (int i = 1; i<=n; i++) { int k = i; do { numbers[k % 10]++; k /= 10; } while (k > 0); } for (int number : numbers) { System.out.println(number + " "); } }
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNextInt()){
int n=sc.nextInt();
int arr[]=new int[10];
for(int i=0;i<10;i++){
arr[i]=0;
}
count(n,arr);
for(int i=0;i<9;i++){
System.out.print(arr[i]+" ");
}
System.out.print(arr[9]);
}
}
public static void count(int n,int arr[]){
int i=1;
while(n/i!=0){
int before=n/(i*10);
int after=n%i;
int current=(n/i)%10;
if(current==0){
arr[0]+=(before-1)*i+after+1;
}else{
arr[0]+=before*i;
}
for(int index=1;index<10;index++){
if(index<current){
arr[index]+=(1+before)*i;
}else if(index==current){
arr[index]+=before*i+after+1;
}else{
arr[index]+=before*i;
}
}
i=i*10;
}
}
} //时间复杂度O(log10(N))