poj1016:Numbers That Count

模拟题

一些测试数据:

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
123456789 is self-inventorying after 5 steps
654641656 enters an inventory loop of length 2
2101400052100005496 enters an inventory loop of length 2
10000000002000000000 enters an inventory loop of length 3
333 is self-inventorying after 11 steps
1 is self-inventorying after 12 steps
99999999999999999999999999999999999999999999999999999999999999999999999999999999 can not be classified after 15 iterations
0000 enters an inventory loop of length 2
0001 is self-inventorying after 8 steps
0111 is self-inventorying after 8 steps
1111 is self-inventorying after 8 steps
123456789 is self-inventorying after 5 steps
456137892 is self-inventorying after 5 steps
123213241561 enters an inventory loop of length 2
543265544536464364 enters an inventory loop of length 2
5412314454766464364 is self-inventorying after 3 steps
543267685643564364 enters an inventory loop of length 2
5423434560121016464364 is self-inventorying after 3 steps




# include <stdlib.h>
# include <string>
# include <string.h>
# include <stdio.h>

char s[20][200];

int cmp (int i, int j) {
	int t = strlen(s[i]) > strlen(s[j]) ? strlen(s[i]) : strlen(s[j]);
	for (int x = 0; x < t; ++ x) {
		if (s[i][x] != s[j][x]) return 0;
	}
	return 1;
}

int check(int k) {
	for (int i = 0; i < k; ++ i) {
		if (cmp(i, k)) return i;
	}
	return -1;
}

int go (int k) {
	char t1[200];
	int t2[11];
	memset(t2, 0, sizeof(t2));
	for (int i = 0; i < (int)strlen(s[k]); ++ i) {
		++ t2[s[k][i] - '0'];
	}
	int cnt = -1;
	for (int i = 0; i < 10; ++ i) {
		if(t2[i] < 10 && t2[i] > 0) {
			t1[++ cnt] = (char) ('0' + t2[i]);
			t1[++ cnt] = (char) ('0' + i);
		}
		if (t2[i] > 9 && t2[i] < 100) {
			t1[++ cnt] = (char) ('0' + t2[i] / 10);
			t1[++ cnt] = (char) ('0' + t2[i] % 10);
			t1[++ cnt] = (char) ('0' + i);
		}

	}
	t1[++ cnt] = '\0';
	memcpy(s[k + 1], t1, sizeof(t1));
	if(k + 1 > 15) {printf ("%s can not be classified after 15 iterations\n", s[0]); return 0;}
	if (check(k + 1) > 0) {
		if(cmp(k + 1, k)) {
			printf ("%s is self-inventorying after %d steps\n", s[0], k);
			return 0;
		}
		else {
			printf ("%s enters an inventory loop of length %d\n", s[0], k + 1 - check(k + 1));
			return 0;
		}
	}
	else if (check(k + 1) == 0) {
		if(k == 0) {
			printf ("%s is self-inventorying\n", s[0]); 
			return 0;
		}
		else {
			printf ("%s enters an inventory loop of length %d\n", s[0], k + 1 - check(k + 1));
			return 0;
		}
	}
	
	go(k + 1);
	return 0;
}


int main () {
	memset (s, 0, sizeof(s));
	for (;;) {
		scanf ("%s", s[0]);
		if (s[0][0] == '-') return 0;
		go(0);
	}
	return 0;
}





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值