NC15327. 统计数字
描述
输入描述
有多组测试用例,输入到文件末尾。每一个测试用例占一行,输入一个整数n,代表书的总页码。1<=n<1e9
输出描述
每10行代表一个测试用例。在一个测试用例中,在第k行输出页码中用到数字k-1的次数。(k=1,2,...,10)
示例1
输入:
11
输出:
1 4 1 1 1 1 1 1 1 1
C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 448K, 提交时间: 2023-05-26 07:07:39
#include<stdio.h> int main() { long long n; while(~scanf("%lld",&n)) { long long a[25]={0}; long long sum=0,p,x=1,i,j; while(n/x) x*=10; while(x>1) { x/=10; p=n/x; n=n-p*x; a[p]+=n+1; for(i=0;i<10;i++) { if(i<p) a[i]+=(sum+1)*x; else a[i]+=(sum)*x; } a[0]-=x; sum=sum*10+p; } for(i=0;i<10;i++) printf("%d\n",a[i]); } return 0; }
C 解法, 执行用时: 3ms, 内存消耗: 420K, 提交时间: 2021-11-06 16:20:01
#include<stdio.h> long long n; int count(long long n,int x) { int high,cnt=0,k; for(int i=1;k=n/i;i*=10) { high=k / 10; if(x==0) { if(high) high--; else break; } cnt+=high*i; long long Now=k%10; if(Now>x) { cnt+=i; } if(Now==x) { cnt+=n-k*i+1; } } return cnt; } int main() { while(scanf("%d",&n) != EOF) { for(int i=0;i<=9;i++) { printf("%d\n",count(n,i)); } } return 0; }