又写了一道水题,按照顺序写的。不知道能不能坚持下去。
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
/*
* https://poj.org/problem?id=1002
*
* 题简单的没什么可说的 重点是更快的输入处理能力
* AC 的耗时很长,肯定有优化的余地,我只是个菜鸟,
* 仅供参考
*
* @author: aisensiy(https://weibo.com/alistapart)
*/
using namespace std;
// 这是 A-Z 与数字的映射表
int charmap[26] = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
// 这就是带我 AC 的函数 如果用 C++ 的 getline 的话 是过不了的!
void _getline(char *line, int lim) {
int c, i;
for(i=0; i<lim-1 && (c=getchar())!='n' && c != EOF; i++)
line[i] = c;
line[i] = '\0';
}
int main() {
int n;
string line, res;
vector<string> lines;
map<string, int> countmap;
char _line[128];
cin>>n;
getline(cin, line);
for(int i=0; i<n; i++) {
//这是原来的语句
//getline(cin, line);
_getline(_line, 128);
line = _line;
//cout<<line<<" ";
res = "";
for(int i=0, c=0; i!=line.size(); i++) {
if(line[i] <= '9' && line[i] >= '0') { res += line[i]; c++; }
else if(line[i] <= 'Z' && line[i] >= 'A') { res += charmap[line[i] - 'A'] + '0'; c++; }
if(c == 3) { res += '-'; c++; }
}
//cout<<res<<endl;
countmap.count(res) ? countmap[res]++ : countmap[res] = 1;
}
vector<string> output;
for(map<string, int>::iterator i = countmap.begin(); i != countmap.end(); ++i) {
if(i->second > 1) output.push_back(i->first);
}
if(output.size() == 0) cout<<"No duplicates."<<endl;
else {
sort(output.begin(), output.end());
for(int i=0; i!=output.size(); i++)
cout<<output[i]<<" "<<countmap[output[i]]<<endl;
}
return 0;
}
一直都对 C/C++ 有抵触心理,嫌麻烦。不过由于如果想要做相关的训练,就必须依赖于这个平台。于是昨天就重新回顾了一下 C++ 的语法,不求精通,只求可以写出来能 AC 的程序... 下面就是我写的第一道 AC 的题了。
1001
#include
#include
#include
#include
/*
* 题目:计算一个大数的 n 次方 结果要求是绝对精确值
* http://poj.org/problem?id=1001
*
* 我也没有看其他高人的算法 而是凭自己的想法做出来的
* 核心就是用字符串模拟了小学教的乘法 还有 加法运算
*
* @author: aisensiy(http://weibo.com/alistapart)
*/
using namespace std;
string multi(string a, string b);
int main() {
string num, res;
int n;
while(cin>>num>>n) {
res = "1";
//通过乘法计算出 n 次方
for(int i=0; i res = multi(res, num);
}
//目前的结果忽略了所有的小数点
//需要做进一步处理
string new_res;
int zero, i, flag = 0;
//首先删除前面多余的零
for(i=0; i= res.size()) { new_res += '.'; flag = 1; }
for(int i = 0, j = res.size(), tail = res.size(); i < tail; --j) { if(zero == j && !flag) new_res += '.'; else if(zero > res.size()) { new_res += '0'; --zero; }
else { new_res += res[i++]; }
}
if(zero != 0) {
for(i = new_res.size() - 1; i >= 0 && new_res[i] == '0'; i--);
new_res = new_res.substr(0, new_res[i] == '.' ? i : i + 1);
}
cout<= 0; --i) {
if(b[i] == '.') { b_i = i; continue; }
int borrow = 0;
string v;
for(int j = a.size() - 1; j >= 0; --j) {
if(a[j] == '.') { a_i = j; continue; }
int cur = (a[j] - '0') * (b[i] - '0') + borrow;
v += (cur % 10) + '0';
borrow = cur / 10;
}
if(borrow) v += '0' + borrow;
string z(zero, '0');
v = z + v;
reverse(v.begin(), v.end());
res = add(res, v);
zero++;
}
return res;
}
/**
* 两个数的加法
* 同样忽略了小数点
*/
string add(string a, string b) {
string v;
int borrow = 0;
for(int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; --i, --j) {
int cur = (i >= 0 ? a[i] - '0' : 0) + (j >= 0 ? b[j] - '0' : 0) + borrow;
v += '0' + cur % 10;
borrow = cur / 10;
}
if(borrow) v += '0' + borrow;
reverse(v.begin(), v.end());
return v;
}
前一阵子看了小平的一篇 blog,会想到自己以前做的一些项目有感而发。
导致一个结果的因素分主客观,客观因素是多事的客户,主观因素是自己的设计。两者的权重此消彼长,此长彼消。 客户多事,需求反复修改,其实已经算是一个非常常见,几乎不能避免的事情。与其指望碰到好伺候的客户,不如自己在一开始就想好项目在哪里变更的几率大,做好设计,给自己留下后路。 不过话说回来,设计也是成本,而且是很大的成本。面对紧张的开发时间,尤其是自己给自己带来的那种急切的开发完成的想法,总是敦促着自己快快着手开始编码。这与静下心来,好好写写设计以及开发流程什么的真的是难以调和的矛盾。而且,想做个好的设计也不单单是时间的问题。那真的需要自己仔仔细细的去想一想才行。有的时候,想的太复杂,封装层次太多,很可能没有这个必要,而且会让自己的初期开发反而更加麻烦。但是有的时候想的太简单,没有合适的结构,一遇到要修改的地方,实在是棘手。
那么面对这么多种种乌七八糟的事情,应该怎么办呢?我自己有这样的一点想法,希望写下来留下罪证,以便自己以后可以回顾一下。
第一,放弃不靠谱的项目。这是一个眼前利益,与长远发展的权衡。一个不靠谱的项目可能会让你身心俱损,但是依个人的责任感说,既然肯接,就一定会努力完成。就算是搓了点,累了点,但终究是会交差。起码做了一个就有一个的钱。不接,一分钱都没有。但是,我在想,真正的价值不仅仅是金钱,还有计算你所花费的时间,你所损耗的精力,以及其对你心态等等方方面面的影响。一个不靠谱的项目终究是会给你带来金钱(别告诉我没钱,咱们就不用这样讨论了不是)。但是,你耗费了大量的时间和精力。那这些时间和精力你还是可以去做很多其他事情的。你可以看书,可以上课,可以运动,可以很朋友同学出去玩,交流感情(要是一不小心,找到个女朋友,赚大了)。其实这些都不比内心满含怨念的写代码换来的 RMB 贱。很多东西是不能仅仅拿 RMB 衡量的。而且,用来看书和学习的时间是你厚积而薄发的基础,跬步的积累是真正爆发不可或缺的内容。如果项目靠谱,在获取金钱的同时也可以收获很多其他的内容,那当然是绝对不能错过的。但是,如果仅仅是为了挣点外快而勉强接受了一个自己一开始就觉得不靠谱的项目,那之后让自己捶胸顿足、夜夜熬战就是为了赚那么点钱实在就是得不偿失了。 同样的,君子不立于危墙。应当在根源上根除不靠谱,一开始就来到了不靠谱的环境,今后有什么非同寻常又收效甚微的情况就属正常现象了。该离开时就离开,自己的生活,酸甜苦辣自己最清楚。
第二,端正自己的心态,尤其是要积极的去调整自己的心态。我想来想去,很多事情,真的就是心态的问题。 其实很多工作没有那么复杂,要改个功能什么的,算上自己的重构和设计方面的考虑,可能也不会花费那么多的时间。关键是内心的抵触情绪让自己难以立即着手工作。写程序的时候是最不能钻牛角尖的,总有那么一些时候就是有个什么 bug 搞不定,就是非要在那个时候搞定才罢休,但是那个时候的自己早就已经心浮气躁不能很好的去判断这个 bug 的原因了。盲目的消耗下去是不可取的。学会调整自己的心态,先休息一下,转而去做一些其他方面的东西没准儿会让自己突然想到 bug 的起因。
工作应该是自己喜欢的事业,是能给自己带来快乐的,自己应该是更积极更主动的思考,而不是被动的接受别人的要求像机器一样运转。程序员本身就应该是很高端的工作,代码只是自己想法的实现,更重要的应该是自己的思考:程序的思想,数据的结构,算法的实现。如果是仅仅是拿到别人的非常详细的需求然后"翻译"成相应的语言,那整个流程就全反了。