http://poj.org/problem?id=1016

一道字符串处理的题目,理解题意后注意细节就好。

题意:每一串数字 都可以写成 a1 b1 a2 b2 ....ai bi

其中ai是指bi这个数字,在一串数字中出现过多少次。也就是每一串数字都可以转换成这一种形式

题目就是给你一串数字,让你转换

如果转换后的数字和第一个数字一模一样的话,那么这一种类型被称为 self-inventorying

如果要通过N次转换后,n+1次和n是一模一样的话,那么这一种就被称为is self-inventorying after n steps

如果通过N(N<15)次转换后,在这N次的转换的数串之中,每隔K次就出现同一串数字,那么这种类型被称为 enters an inventory loop of length K

如果15次后,前面三种都没出现的话,那么被称作为can not be classified after 15 iterations

解题思路:

首先每一个数字都要进行统计,那么就需要一个统计次数的一个函数,因为这个需要多次使用。(这里注意次数可能会超过10次)。

其次利用strcmp函数判断两个字符串是否相等,strcmp函数的话,当两个串相等的时候是返回0.

然后就多次反复比较。

我写的还是比较丑。

有很大的优化空间,首先就是那个num可以放到cmp里,这样可以减少很多行的代码。

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char num[],cmp[][],ans;
  5.  
  6. int sum(char x[],int len,int m) 这个就是那个统计次数的函数。
  7. {
  8. int sum=;
  9. for(int i=;i<len;i++)
  10. if(x[i]==''+m) sum++;
  11. return sum;
  12. }
  13.  
  14. int main()
  15. {
  16. while(scanf("%s",num),num[]!='-'){
  17. int len=strlen(num);
  18.  
  19. ans=;
  20.  
  21. for(int i=,k=;k<=;i++,k++){
  22.  
  23. int tmp=sum(num,len,k);
  24.  
  25. if(tmp==){
  26.  
  27. i--;
  28. continue;
  29.  
  30. }else{
  31. if(tmp>=){ //用来形成新的数串。
  32. cmp[][i]=tmp/+'';
  33. cmp[][++i]=tmp%+'';
  34. cmp[][++i]=k+'';
  35. }
  36. else {
  37. cmp[][i]=tmp+'';
  38. cmp[][++i]=k+'';
  39. }
  40. }
  41. }
  42. int flog=;
  43. if(strcmp(cmp[],num)==){
  44.  
  45. printf("%s is self-inventorying\n",num);
  46. flog=;
  47. }
  48. else{
  49.  
  50. for(int i=;i<=;i++){
  51. ans++;
  52. int len=strlen(cmp[i-]);
  53. for(int m=,k=;k<=;m++,k++){
  54.  
  55. int tmp=sum(cmp[i-],len,k);
  56.  
  57. if(tmp==){
  58.  
  59. m--;
  60. continue;
  61.  
  62. }else{
  63. if(tmp>=){
  64. cmp[i][m]=tmp/+'';
  65. cmp[i][++m]=tmp%+'';
  66. cmp[i][++m]=k+'';
  67. }
  68. else {
  69.  
  70. cmp[i][m]=tmp+'';
  71. cmp[i][++m]=k+'';
  72. }
  73. }
  74. }
  75. if(strcmp(cmp[i],cmp[i-])==){
  76. printf("%s is self-inventorying after %d steps\n",num,ans);
  77. flog=;
  78. break;
  79. }
  80. }
  81. }
  82. if(flog==){
  83. for(int i=;i<;i++){
  84. for(int j=i+;j<;j++)
  85. if(strcmp(cmp[i],cmp[j])==) {
  86. printf("%s enters an inventory loop of length %d\n",num,j-i);
  87. flog=;
  88. break;
  89. }
  90. if(flog) break;
  91. }
  92. if(flog==) printf("%s can not be classified after 15 iterations\n",num);
  93. }
  94. memset(num,,sizeof(num));
  95. memset(cmp,,sizeof(cmp));
  96. }
  97. return ;
  98. }

POJ 1016的更多相关文章

  1. POJ 1016 模拟字符串

    Numbers That Count Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20396   Accepted: 68 ...

  2. poj 1016 Numbers That Count

    点击打开链接 Numbers That Count Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17922   Accep ...

  3. Numbers That Count POJ - 1016

    "Kronecker's Knumbers" is a little company that manufactures plastic digits for use in sig ...

  4. POJ 1016 Numbers That Count 不难,但要注意细节

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

  5. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  6. POJ 题目分类(转载)

    Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...

  7. (转)POJ题目分类

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

  8. poj分类

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  9. poj 题目分类(1)

    poj 题目分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K--0.50K:中短代码:0.51K--1.00K:中等代码量:1.01K--2.00K:长代码:2.01 ...

随机推荐

  1. VFP笔记

    1.计算圆的面积的计算器 650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/12/43/wKiom1MAsFzxm ...

  2. jquery 选择器 -高级使用 新的 心得

    jQuery的each函数: each函数等同于c语言中的for函数: 里面每次循环的 "context 上下文" == 当前的dom ,可以使用this, 也可以使用$(this ...

  3. div+css使多行文字垂直居中?

    1.单行文字: 设置height = line-height; 多行文字: 设置 padding, 自己要计算一下? vertical-align: 可以设置垂直居中, 但是只是针对本身就具有 ali ...

  4. strtr函数的用法

    http://php.net/manual/en/function.strtr.php <?php $trans = array("h" => "-" ...

  5. jQuery回调、递延对象总结(下篇) —— 解密jQuery.when方法

    前言: 前一篇文章中重点总结了一下then方法,它主要用来处理多个异步任务按顺序执行,即前一个任务处理完了,再继续下一个,以此类推: 而这一章节jQuery.when方法也是处理多个异步任务,它把多个 ...

  6. jQuery源码-dom操作之jQuery.fn.html

    写在前面 前面陆陆续续写了jQuery源码的一些分析,尽可能地想要cover里面的源码细节,结果导致进度有些缓慢.jQuery的源码本来就比较晦涩,里面还有很多为了解决兼容问题很引入的神代码,如果不g ...

  7. JavaScript中 window.parent 、window.top、window.self代表的含义

    在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...

  8. HDU 2014

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> typedef float ElementType; void Select_Sort ...

  9. C#中页面之间传值传参的六种方法

    QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法.但是对于传递数组或对象的话,就不能用这 ...

  10. 安装 vue.js和第一个hello world

    一.在自己的项目文件中使用npm下载vue npm install vue 二.在文件中引入vue.js 三.第一个hello world 注:scritpt代码必须写在html代码的下面