您的位置:首页 > 其它

noj1201 统计数字问题

2014-12-16 19:05 295 查看
/*
* 发现0~(x*10+9)的时候个位数正好是0到9*x
* 所以将n减到模10余9
* 然后处理非个位数,就是n/10的结果*10
* 递归可解
* solve是暴力解法,显然会T,用来对拍
* solve2是递归解法 可过
* noj1201
*/
/*************************************************************************
> File Name: 1201.cpp
> Author: UnknownCUnknown
> Mail: jsnjhcb@icloud.com
> Created Time: 二 12/16 17:49:57 2014
************************************************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <list>
#include <string>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <climits>
using namespace std;
int ans[10];
void solve(int n){
for(int i=1;i<=n;++i){
int tmp=i;
while(tmp){
++ans[tmp%10];
tmp/=10;
}
}
}
void solve2(int n,int sign){
if(n<10){
for(int i=1;i<=n;++i){
ans[i]+=sign;
}
}
else{
while(n%10!=9){
int tmp=n;
while(tmp){
ans[tmp%10]+=sign;
tmp/=10;
}
--n;
}
if(n<10){
for(int i=1;i<=9;++i){
ans[i]+=sign;
}
return;
}
for(int i=0;i<=9;++i){
ans[i]+=(1+n/10)*sign;
}
ans[0]-=sign;
solve2(n/10,sign*10);
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(ans,0,sizeof ans);
solve2(n,1);
for(int i=0;i<=9;++i){
printf("%d\n",ans[i]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: