zoukankan      html  css  js  c++  java
  • UVa 1583 Digit Generator --- 水题+打表

      UVa 1583

      题目大意:如果x加上x的各个数字之和得到y,那么称x是y的生成元。

           给定数字n,求它的最小生成元

      解题思路:可以利用打表的方法,提前计算出以i为生成元的数,设为d,并保存在a[d]中(a[d]=i),反复枚举,若是初次遇到或遇到更小的则更新

      相关说明:本来按书上来,在更新数组a时,if里是有或上 i < a[y]这个条件的,

           但观察到由于i是从小到大枚举的,因此只会更新一次,即第一次填进去的就是最小生成元,因此去掉仍然AC

    /* UVa 1583 Digit Generator --- 水题+打表 */
    #include <cstdio>
    #include <cstring>
    
    const int maxn = 100005;
    int a[maxn]; //a[i]的值表示i的最小生成元是a[i]
    
    int main()
    {
        memset(a, 0, sizeof a);
        for (int i = 1; i < maxn; ++i){
            int x = i, y = i;
            //通过i并类加上各位置的和得到y,因而i是y的生成元 a[y] = i;
            while (x){
                y += x % 10;
                x /= 10;
            }
            //i是y的生成元 由i--->y的
            //若是第一次算出y 或者 当前生成元比以前的更小 则更新
            //本来按书上来if里是有或上 i < a[y]这个条件的 
            //但是由于i是从小到大枚举的 因此只会更新一次 即第一次填进去的就是最小生成元 因此去掉仍然AC
            if (a[y] == 0){ // || i < a[y]
                a[y] = i;
            }
        }//for(i)
    
        int t, n;
        scanf("%d", &t);
        while (t--){
            //打完表后每次读取便可
            scanf("%d", &n);
            printf("%d
    ", a[n]);
        }//while(t)
    
    
        return 0;
    }
    View Code
  • 相关阅读:
    docker使用
    window版docker安装及配置
    mysql命令
    xshell
    git 命令
    分页器原理
    PCL-Kinfu编译手册
    cmake-add_definitions
    cmake-include_directories
    cmake-source_group
  • 原文地址:https://www.cnblogs.com/tommychok/p/5313914.html
Copyright © 2011-2022 走看看