2522:A simple problem
2015-09-26 09:33
148 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2522
方法:hash
思路:这道题的思路不太好想,主要是要想到为什么会出现循环小数。我们可以思考一下整数除法,为什么会出现循环的商出现,根本原因是在除法过程中,每上一位商,留下的余数如果出现过,那么则意味着除法过程再次回到了起点,对应的商也就循环了。想明白这一点,就可以用hash记录余数出现的位置,一旦再次出现这个余数,则证明循环开始了。
难点:本题正常组织代码会有时间上的问题。尤其是memset函数非常耗时,需要合理安排其位置。并且使用memset(vis,0,(n+100)*sizeof(vis[0]));
这个方法会更快。
参考链接:http://blog.csdn.net/hnust_xiehonghao/article/details/8986565
方法:hash
思路:这道题的思路不太好想,主要是要想到为什么会出现循环小数。我们可以思考一下整数除法,为什么会出现循环的商出现,根本原因是在除法过程中,每上一位商,留下的余数如果出现过,那么则意味着除法过程再次回到了起点,对应的商也就循环了。想明白这一点,就可以用hash记录余数出现的位置,一旦再次出现这个余数,则证明循环开始了。
难点:本题正常组织代码会有时间上的问题。尤其是memset函数非常耗时,需要合理安排其位置。并且使用memset(vis,0,(n+100)*sizeof(vis[0]));
这个方法会更快。
参考链接:http://blog.csdn.net/hnust_xiehonghao/article/details/8986565
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int hashset[1000000] = {0}; int main() { int t,n; while(~scanf("%d",&t)) { while(t--) { scanf("%d",&n); if(n == 1) printf("1\n"); else { if(n<0) { printf("-"); n = -n; } memset(hashset,0,(n+100)*sizeof(hashset[0])); printf("0."); int z = 1; while(z) { hashset[z] = 1; z *= 10; //cout<<z<<" "; printf("%d",z/n); z = z%n; if(hashset[z]) break; } printf("\n"); } } } }
相关文章推荐
- 继承概念
- MySQL快速复制数据库的方法
- 测试用例模板
- c/c++程序调试
- MySQL Cluster(MySQL 集群) 初试
- 【设计原则】面向对象编程的六大原则
- java的数字相加
- 第一次编辑JAVA
- UVa 11292:Dragon of Loowater(水题)
- 浅论MLP、ELM、SVM的效果
- 懒人的思考造就了方法
- 《大道至简》第二章读后感
- 【转】写一个标准宏MIN,这个宏输入两个参数并返回较小的那个。另外当写下least=MIN(*p++,b)时会发生什么
- Swift 分割字符串
- 查看redis keys
- OCP-1Z0-051-名称解析-文章32称号
- 工资的差距是怎么来的
- 分享:Android -- Properties使用
- hive安装配置
- hive安装配置