zoukankan      html  css  js  c++  java
  • POJ 1016 Numbers That Count 不难,但要注意细节

    题意是将一串数字转换成另一种形式。比如5553141转换成2个1,1个3,1个4,3个5,即21131435。1000000000000转换成12011。数字的个数是可能超过9个的。n个m,m是从小到大排序。

    输出的结果又四种情况,建议判断的时候就按照题目的顺序进行判断,否则可能出错。第一种情况是进行一次变换后和原来的数字相同;第二种是进行j次后和原来数字相同;第三种是变换过程中形成了循环,比如70:
          

    70是2循环,又最后3组数字可判断出;第四种情况是超过15次变换仍然找不出规律。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define MAX 85
    using namespace std;
    
    char n[MAX];
    int a[10];
    
    int main()
    {
        freopen("in.txt","r",stdin);
        while(1)
        {
            char str[16][MAX]= {0}; //先全部变换,将原始数字和变换后的都保存下来
            memset(n,0,sizeof(n)); //初始化
            scanf("%s",n);
            if(n[0]=='-')
                break;
            strcpy(str[0],n);
            for(int i=0; i<15; i++) //15次变换
            {
                memset(a,0,sizeof(a)); //初始化
                for(int j=0; j<10; j++) //查找0~9每个数字,并保存至数字a[j]
                    for(int k=0; k<strlen(str[i]); k++)
                    {
                        if(str[i][k]==j+'0')
                            a[j]++;
                    }
                for(int j=0,k=0; j<10; j++)
                    if(a[j]>=10) //这里的细节需要注意一下,个数大于或等于10,需要保存三位数
                    {
                        str[i+1][k]=a[j]/10+'0';
                        str[i+1][k+1]=a[j]%10+'0';
                        str[i+1][k+2]=j+'0';
                        k+=3;
                    }
                    else if(a[j]>0 && a[j]<10)
                    {
                        str[i+1][k]=a[j]+'0';
                        str[i+1][k+1]=j+'0';
                        k+=2;
                    }
            }
            bool flag=true;
            if(strcmp(str[0],str[1])==0)
            {
                printf("%s is self-inventorying
    ",str[0]);
                flag=false;
            }
            if(flag)
                for(int i=1; i<=15; i++)
                    if(strcmp(str[i],str[i+1])==0)
                    {
                        printf("%s is self-inventorying after %d steps
    ",str[0],i);
                        flag=false;
                        break;
                    }
            if(flag)
                for(int i=13; i>=0; i--)
                    if(strcmp(str[15],str[i])==0)
                    {
                        printf("%s enters an inventory loop of length %d
    ",str[0],15-i);
                        flag=false;
                        break;
                    }
            if(flag)
                printf("%s can not be classified after 15 iterations
    ",str[0]);
        }
        return 0;
    }
  • 相关阅读:
    System.Configuration引用后ConfigurationManager方法用不了
    HTTP 错误 500.23
    slide ——首尾相接の平滑切换效果
    函数式编程初探之回调
    Call & Apply. It's easy!
    【W3C】 CSS3选择器
    再谈原型和原型链
    ECMA学习小结(3)——constructor 和 prototype
    ECMA学习小结(2)——一切皆对象
    ECMA学习小结(1)——什么是ECMAScript,JAVAScript与ECMA的关系
  • 原文地址:https://www.cnblogs.com/pach/p/5723373.html
Copyright © 2011-2022 走看看