POJ 1016 Numbers That Count

题目链接:http://poj.org/problem?id=1016

题目描述:

    计算数字特点:给定一个长在80以内的字符串n,每一个字符为(09),有一种压缩的方法,即将数字记录成为:个数+数字。比如,41321314,认为是4132......,经压缩一次后有31122324

1.当一次压缩后值与原始值相等,输出nis self-inventorying

2.若上述不成立,则继续压缩,当压缩jj<=15)次后,使得压缩j次的字符串与压缩j+1次的字符串相等,则输出:nis self-inventorying after j steps

3.若上述不成立,则若压缩ii<14)次得到的字符串与压缩ji<j<=15)次得到的字符串相等,并且k=j-i(大于等于2)是所有满足中的最小;则输出nenters an inventory loop of length k

4.都不成立时,输出ncan not be classified after 15 iterations

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std ;

char b[20][100] ;
int rec[20][10] ;

void cal(char* a, int t){
	int len1 = strlen(a) ;
	int num = 0 ;
	int t1[10] = {0} ;
	for( int i = 0; i < len1; i++ ){
		t1[a[i]-'0']++ ;
	}
	for( int i = 0; i < 10; i++ ){
		if( t1[i] == 0 )
			continue ;
		if( t1[i] >= 10 ){
			b[t][num++] = t1[i]/10 + '0' ;
			b[t][num++] = t1[i]%10 + '0' ;		
		}
		else{
			b[t][num++] = t1[i] + '0' ;	
		}
		b[t][num++] = i + '0' ;		
	}
	b[t][num] = '\0' ;
}

int main(){
	//freopen("1234.in","r",stdin) ;
	while( cin >> b[0] ){
		if( b[0][0] == '-' )
			break ;
		printf("%s ",b[0]) ;
		
		for( int i = 1; i <=15; i++ ){
			cal(b[i-1],i) ;
		}
		if( strcmp(b[0],b[1]) == 0 )
			cout << "is self-inventorying\n" ;
		else{
			bool tt = false ;
			for( int i = 1; i <= 15; i++ ){
				if( strcmp(b[i],b[i+1]) == 0 ){
					cout << "is self-inventorying after " << i << " steps\n" ;
					tt = true ;
					break ;				
				}			
			}
			if( !tt ){
				for( int i = 1; i <= 15; i++ ){
					for( int j = 0; j < i-1; j++ ){
						if( strcmp(b[i],b[j]) == 0 ){
							tt = true ;
							cout << "enters an inventory loop of length " << i-j << endl ;
							break ;				
						}
					}
					if( tt )
						break ;			
				}		
			}
			if( !tt ){
				cout << "can not be classified after 15 iterations\n" ;
			}		
		}
	}
	return  0 ;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值