一道签到题
2015-08-08 17:43
190 查看
问题 A: 一道签到题
时间限制: 2 Sec 内存限制: 128 MB提交: 68 解决: 32
[提交][状态][讨论版]
题目描述
我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数、循环节以及循环节长度输入
输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100输出
分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔样例输入
8.6987698769876987 0.666 5.1
样例输出
4 6987 4 1 6 3 1 1 1
可以暴力解,也能套kmp模板,多记俩公式。
公式原理在:http://blog.csdn.net/kflcg/article/details/47340629
代码:
#include<stdio.h> #include<string.h> char str[300]; int len,p[300]; void getp() { int i=0,j=-1; p[0]=j; while(i<len) { if(j==-1||str[i]==str[j]) { i++;j++; p[i]=j; } else{ j=p[j]; } } if(i%(i-p[i])==0&&p[i]!=0)//判断有无循环(其实本体确定有循环的) { printf("%d ",i-p[i]);//循环节长度公式 for(int k=0;k<i-p[i];k++) printf("%c",str[k]);//输出循环节 printf(" %d\n",i/(i-p[i]));//循环次数 } else { printf("%d ",len); for(int k=0;k<len;k++) printf("%c",str[k]); printf(" 1\n"); } } int main() { int d; while(scanf("%d",&d)!=EOF)//第一位是整数部分,没用,拿来判断是否文件结束 { char x; while(scanf("%c",&x),x!='.');//吸收小数点及以前的整数部分,剩下的存字符数组 scanf("%s",str); len=strlen(str); getp(); } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例