【題解】UVa 1225【Digit Counting】

请注意:本题解请在C++11标准下执行(因为使用了C++11中的to_string()全局函数)(NOI(P)不支持C++11差评)

三个函数:

读入:std::string read();//将所给数字读入,并转化成字符串,即12345678910…n,返回这个字符串,(C++整形和字符串不能相加差评)

解题:void solve();//创建对应于0~9的数组ans[0~9],然后暴力枚举每一位,并使其自增。

主函数:int main();//因为有多组输入,所以对应循环调用n次solve()函数即可。easy~

注意点:UVa没有滤去行末空格的比较差评即每行最后一个数后不能有空格,还需要一个换行

#include<cstdio>
#include<string>
#include<iostream>

std::string read(){
    std::string s;//创建用于统计的字符串

    int num;
    scanf("%d",&num);//输入num

    //将1~n的数拼在一起
    //即将i转换成string类型,然后和原来的s相加即可
    for(int i = 1;i <= num;i++){
        s += std::to_string(i);
    }

    return s;//返回
}

void solve(){
    std::string s = read();//得到字符串

    int ans[10] = {};//用于保存答案的数组

    //分别枚举每一个数
    for(int i = 0;i < s.length();i++){
        if(s[i] == '0'){
            ans[0]++;
        }else if(s[i] == '1'){
            ans[1]++;
        }else if(s[i] == '2'){
            ans[2]++;
        }else if(s[i] == '3'){
            ans[3]++;
        }else if(s[i] == '4'){
            ans[4]++;
        }else if(s[i] == '5'){
            ans[5]++;
        }else if(s[i] == '6'){
            ans[6]++;
        }else if(s[i] == '7'){
            ans[7]++;
        }else if(s[i] == '8'){
            ans[8]++;
        }else if(s[i] == '9'){
            ans[9]++;
        }
    }

    //先输出前9个
    for(int i = 0;i < 9;i++){
        printf("%d ",ans[i]);
    }
    //在输出最后一个
    printf("%d\n",ans[9]);
}

//优雅的主函数
int main(){
    int n;
    scanf("%d",&n);

    for(int i = 0;i < n;i++){
        solve();
    }

    return 0;
}