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里,这样可以减少很多行的代码。

 #include <stdio.h>
#include <string.h> char num[],cmp[][],ans; int sum(char x[],int len,int m) 这个就是那个统计次数的函数。
{
int sum=;
for(int i=;i<len;i++)
if(x[i]==''+m) sum++;
return sum;
} int main()
{
while(scanf("%s",num),num[]!='-'){
int len=strlen(num); ans=; for(int i=,k=;k<=;i++,k++){ int tmp=sum(num,len,k); if(tmp==){ i--;
continue; }else{
if(tmp>=){ //用来形成新的数串。
cmp[][i]=tmp/+'';
cmp[][++i]=tmp%+'';
cmp[][++i]=k+'';
}
else {
cmp[][i]=tmp+'';
cmp[][++i]=k+'';
}
}
}
int flog=;
if(strcmp(cmp[],num)==){ printf("%s is self-inventorying\n",num);
flog=;
}
else{ for(int i=;i<=;i++){
ans++;
int len=strlen(cmp[i-]);
for(int m=,k=;k<=;m++,k++){ int tmp=sum(cmp[i-],len,k); if(tmp==){ m--;
continue; }else{
if(tmp>=){
cmp[i][m]=tmp/+'';
cmp[i][++m]=tmp%+'';
cmp[i][++m]=k+'';
}
else { cmp[i][m]=tmp+'';
cmp[i][++m]=k+'';
}
}
}
if(strcmp(cmp[i],cmp[i-])==){
printf("%s is self-inventorying after %d steps\n",num,ans);
flog=;
break;
}
}
}
if(flog==){
for(int i=;i<;i++){
for(int j=i+;j<;j++)
if(strcmp(cmp[i],cmp[j])==) {
printf("%s enters an inventory loop of length %d\n",num,j-i);
flog=;
break;
}
if(flog) break;
}
if(flog==) printf("%s can not be classified after 15 iterations\n",num);
}
memset(num,,sizeof(num));
memset(cmp,,sizeof(cmp));
}
return ;
}

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. Orchard源码分析(5.3):EndRequest事件处理(DefaultOrchardHost.EndRequest方法)

    EndRequest事件处理的作用是处理完"处理引擎(ProcessingEngine)"中的任务(Task).           void IOrchardHost .EndR ...

  2. Python开发【第十七篇】:MySQL(一)

    一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Serve ...

  3. php 数组排序以及按照某个字段排序

    经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用.PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序. ...

  4. Linux平台延时之sleep、usleep、nanosleep、select比较

    Linux平台延时之sleep.usleep.nanosleep.select比较 标签: 嵌入式thread线程cpu多线程 2015-05-05 15:28 369人阅读 评论(0) 收藏 举报 ...

  5. linux命令--dig

    dig,和nslookup作用有些类似,都是DNS查询工具,但是却比nslookup强大 dig,其实是一个缩写,即Domain Information Groper. [我想用google-DNS来 ...

  6. PHP单一入口apache配置和去除index.php

    index : index在互联网上表示网站的默认主页. 一般为 index.html index.htm index.asp index.php: 另外的默认主页也多用default.html;de ...

  7. shell学习之路:流程控制(if)

    1.单分支if条件语句 if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi 注意事项: 1.if语句使用fi结尾,和一般语言使用大括号结尾不同 2.[ ...

  8. 我常用的eclipse快捷键

    重写父类方法:右键点击, 进source,进override/implement 单行注释(或多行注释) Ctrl+/ 文档注释:shift+alt+J 整块注释: Ctrl+shift+/ 取消整块 ...

  9. caller和callee

    我们先来看下caller. caller:返回一个对函数(该函数调用了当前函数)的引用. functionName.caller:functionName对象是所执行函数的名称. 说明 对于函数来说, ...

  10. 密码学初级教程(一)基本概念及DES加密算法

    密码技术在网络通信中广泛使用,本节是初步接触密码学技术的笔记. 第1章 加密-解密 破译 明文-密文 密钥 密码算法 对称密码-公钥密码(非对称密码) 单向散列函数-散列值 消息认证码 数字签名 伪随 ...