poj1338(啊这题我要死了)
2015-09-18 16:13
330 查看
第一次的代码 存在很大的问题 因为没办法控制规模 所以产生了溢出
第二个方法吧 按顺序来的 但是似乎超时了 网上有建议打表的 可是那样很low啊!
算法还是没变化 就是投机取巧了吧
第三次的代码
似乎是第一种方法 还是用因子为主 但是我之前的第一种方法好乱啊!主要是不按照顺序来 数字最终无法排序 造成了 时间的炒鸡复杂度!
看了网上大神的方法 得出了新的思路。
下标玩的是心跳啊!!!!!!!!真的是心跳啊!!!大神的世界我不懂啊!!!!!!!!!!!!!!!!!
这里要注意啊!!!!!!!!!!!
我觉得这题太tm难啊!!!!!
好过分的啊!!!!!!!!!!
这里必须是if不能使else啊!!!!!!!
因为你要考虑是不是重复的情况啊!!!
刚好相等的时候 就要++啊!!!!!!
#include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; int main() { int a, b, c, i,n; double num[2000000]; double sum; //首先找到所有的 只有2 3 5为因子的数字 一直找到1500 num[0] = 1; i = 1; for (a = 0; a <= 30; a++) { for (b = 0; b <= 17; b++) { for (c = 0; c <= 12; c++) { sum = pow((double)2, a)*pow((double)3, b)*pow((double)5, c); if (sum != 1) { num[i] = sum; i++; } } } } //排序 sort(num, num + i); //下面读取数字 while (true) { cin >> n; if (n == 0) { break; } cout << num[n - 1] << endl; } return 0; }
第二个方法吧 按顺序来的 但是似乎超时了 网上有建议打表的 可是那样很low啊!
算法还是没变化 就是投机取巧了吧
#include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; int main() { int num[1501]; int i = 1; int currentNum = 1,tmp,n; num[0] = 1; while (i <= 1500) { if (((currentNum % 2) == 0) || ((currentNum % 3) == 0) || ((currentNum % 5) == 0)) { //判定是否是dirtyNumber tmp = currentNum; while (tmp % 2 == 0) { tmp = tmp / 2; } while(tmp % 5 == 0) { tmp = tmp / 5; } while(tmp % 3 == 0) { tmp = tmp / 3; } if (tmp == 1)//除开了 { num[i] = currentNum; i++; } } currentNum++; } while (true) { cin >> n; if (n == 0) { break; } cout << num[n - 1] << endl; } return 0; }
第三次的代码
似乎是第一种方法 还是用因子为主 但是我之前的第一种方法好乱啊!主要是不按照顺序来 数字最终无法排序 造成了 时间的炒鸡复杂度!
看了网上大神的方法 得出了新的思路。
下标玩的是心跳啊!!!!!!!!真的是心跳啊!!!大神的世界我不懂啊!!!!!!!!!!!!!!!!!
#include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; int min(int a, int b, int c); int min(int a, int b, int c) { int t = a; if (b < t) { t = b; } if (c < t) { t = c; } return t; } int main() { int ans[1501]; int a = 1, b = 1, c = 1,i=2,n; ans[1] = 1; while (i <= 1500) { ans[i] = min(ans[a] * 2, ans[b] * 3, ans[c] * 5); if (ans[i] == (ans[a] * 2)) { a++; } if (ans[i] == (ans[b] * 3)) { b++; } if (ans[i] == (ans[c] * 5)) { c++; } i++; } while (true) { cin >> n; if (n == 0) { break; } cout << ans << endl; } return 0; }
这里要注意啊!!!!!!!!!!!
我觉得这题太tm难啊!!!!!
好过分的啊!!!!!!!!!!
这里必须是if不能使else啊!!!!!!!
因为你要考虑是不是重复的情况啊!!!
刚好相等的时候 就要++啊!!!!!!
if (ans[i] == (ans[a] * 2)) { a++; } else if (ans[i] == (ans[b] * 3)) { b++; } else { c++; }
相关文章推荐
- gradle项目构建
- 安卓开发基础之tween动画基本使用,代码教学
- MVC 发布到 windows2003遇到 'System.Web.WebPages.Razor 错误提示
- 学习ULua之委托
- Laravel的安装
- cocos2d-js cc.DrawNode用法示例
- 第10章 并发
- 2567:寻梦
- 解决spring要求jdk1.5或更高的问题
- 待人友善是教养 独来独往是性格
- Android学习——PopupWindow
- HDU 1015 Safecracker
- Linq 看文章到第一个小项目
- 部署虚拟机做服务器
- Jboss7使用指定jdk(续)
- IAR程序中获取堆指针与栈指针
- 设计模式之职责链模式(Chain Of Responsibility)
- Android Intent打开任意文件的通用方式
- 1 Two Sum
- fastJson中一些问题总结