POJ 1016 Numbers That Count(水~)

本文探讨了如何判断一个数字串是否具有自我库存特性,包括立即自我库存、经过若干步后自我库存以及循环自我库存的情况。通过实例分析,帮助读者理解和识别不同类型的自我库存数字串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
每个数字串都可以被压缩成c1 d1 c2 d2 … cn dn的形式,如果一个串被压缩几次之后和自己相同则称之为self-inventorying,对于一个串n有三种情况:
1. n压缩1次就马上出现self-inventorying特性,即 n n n n n n n …..
2. n压缩j次后的数字串J出现self-inventorying特性,即 n A B C….H I J J J J J J J
3. n压缩j次后的数字串J,每再压缩K次,重新出现数字串J,即n A B… J ..K J ..K J..K J
其中K称为循环间隔,K>=2
现给出一个数字串,判断其属于以上哪一种
Input
多组用例,每组用例占一行为一长度不超过80的数字串,以-1结束输入
Output
对于每组用例,判断该串属于哪种情况
Sample Input
22
31123314
314213241519
21221314
111222234459
-1
Sample Output
22 is self-inventorying
31123314 is self-inventorying
314213241519 enters an inventory loop of length 2
21221314 is self-inventorying after 2 steps
111222234459 enters an inventory loop of length 2
Solution
水题
Code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 111
char s[22][maxn];
void deal(char *s1,char *s2)
{
    int len=strlen(s1),num[11],res=0;
    memset(num,0,sizeof(num));
    for(int i=0;i<len;i++)
        num[s1[i]-'0']++;
    for(int i=0;i<10;i++)
        if(num[i])
        {
            if(num[i]>9)s2[res++]=num[i]/10+'0',num[i]%=10;
            s2[res++]=num[i]+'0';
            s2[res++]=i+'0';
        }
    s2[res]='\0';
}
int main()
{
    while(~scanf("%s",s[0]),s[0][0]!='-')
    {
        int f1,f2,f3;
        f1=f2=f3=0;
        for(int i=1;i<=15;i++)deal(s[i-1],s[i]);
        if(!strcmp(s[0],s[1]))f1=1;
        if(!f1)
        {
            for(int i=1;i<15;i++)
                if(!strcmp(s[i],s[i+1]))
                {
                    f2=i;
                    break;
                }
            if(!f2)
            {
                for(int i=1;i<=15;i++)
                {
                    for(int j=0;j<=i-2;j++)
                        if(!strcmp(s[i],s[j]))
                        {
                            f3=i-j;
                            break;
                        }
                    if(f3)break;
                }
            }
        }
        if(f1)printf("%s is self-inventorying\n",s[0]);
        else if(f2)printf("%s is self-inventorying after %d steps\n",s[0],f2);
        else if(f3)printf("%s enters an inventory loop of length %d\n",s[0],f3);
        else printf("%s can not be classified after 15 iterations\n",s[0]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值