一部分代码可以优化一下逻辑,能快那么一丢丢。
来看代码,在您的func1(string s)中的:
cout << b[num / 13];
if((num % 13) && (num / 13)) {
cout << " " << a[num % 13];
} else if(num % 13) {
cout << a[num % 13];
} else if(num == 0) {
cout << a[num % 13];
}
这一部分中,只考虑判断部分,简化一下,看得清楚一点:
#include <iostream>
int main(int argc, char** argv) {
int num=4;
if((num % 13) && (num / 13)) {
num=1 ;
} else if(num % 13) {
num=2;
} else if(num == 0) {
num=3;
}
return 0;
}
那么这段代码,main函数生成的汇编如下(GCC 4.7.2):
0x004013b0 <+0>: push ebp
0x004013b1 <+1>: mov ebp,esp
0x004013b3 <+3>: and esp,0xfffffff0
0x004013b6 <+6>: sub esp,0x10
0x004013b9 <+9>: call 0x40dac0 <__main>
0x004013be <+14>: mov DWORD PTR [esp+0xc],0x3
0x004013c6 <+22>: mov eax,DWORD PTR [esp+0xc]
0x004013ca <+26>: mov ecx,0xd
0x004013cf <+31>: cdq
0x004013d0 <+32>: idiv ecx
0x004013d2 <+34>: mov eax,edx
0x004013d4 <+36>: test eax,eax
0x004013d6 <+38>: je 0x4013ee <main(int, char**)+62>
0x004013d8 <+40>: mov eax,DWORD PTR [esp+0xc]
0x004013dc <+44>: add eax,0xc
0x004013df <+47>: cmp eax,0x18
0x004013e2 <+50>: jbe 0x4013ee <main(int, char**)+62>
0x004013e4 <+52>: mov DWORD PTR [esp+0xc],0x1
0x004013ec <+60>: jmp 0x401419 <main(int, char**)+105>
0x004013ee <+62>: mov eax,DWORD PTR [esp+0xc]
0x004013f2 <+66>: mov ecx,0xd
0x004013f7 <+71>: cdq
0x004013f8 <+72>: idiv ecx
0x004013fa <+74>: mov eax,edx
0x004013fc <+76>: test eax,eax
0x004013fe <+78>: je 0x40140a <main(int, char**)+90>
0x00401400 <+80>: mov DWORD PTR [esp+0xc],0x2
0x00401408 <+88>: jmp 0x401419 <main(int, char**)+105>
0x0040140a <+90>: cmp DWORD PTR [esp+0xc],0x0
0x0040140f <+95>: jne 0x401419 <main(int, char**)+105>
0x00401411 <+97>: mov DWORD PTR [esp+0xc],0x3
0x00401419 <+105>: mov eax,0x0
0x0040141e <+110>: leave
0x0040141f <+111>: ret
但是如果把这段代码改为:
#include <iostream>
int main(int argc, char** argv) {
int temp=4;
if (temp / 13 > 0){
temp=1;
if (temp % 13)
temp=2;
}
else
temp=3;
return 0;
}
对应的汇编如下:
0x004013b0 <+0>: push ebp
0x004013b1 <+1>: mov ebp,esp
0x004013b3 <+3>: and esp,0xfffffff0
0x004013b6 <+6>: sub esp,0x10
0x004013b9 <+9>: call 0x40daa0 <__main>
0x004013be <+14>: mov DWORD PTR [esp+0xc],0x2
0x004013c6 <+22>: cmp DWORD PTR [esp+0xc],0xc
0x004013cb <+27>: jle 0x4013f1 <main(int, char**)+65>
0x004013cd <+29>: mov DWORD PTR [esp+0xc],0x1
0x004013d5 <+37>: mov eax,DWORD PTR [esp+0xc]
0x004013d9 <+41>: mov ecx,0xd
0x004013de <+46>: cdq
0x004013df <+47>: idiv ecx
0x004013e1 <+49>: mov eax,edx
0x004013e3 <+51>: test eax,eax
0x004013e5 <+53>: je 0x4013f9 <main(int, char**)+73>
0x004013e7 <+55>: mov DWORD PTR [esp+0xc],0x2
0x004013ef <+63>: jmp 0x4013f9 <main(int, char**)+73>
0x004013f1 <+65>: mov DWORD PTR [esp+0xc],0x3
0x004013f9 <+73>: mov eax,0x0
0x004013fe <+78>: leave
0x004013ff <+79>: ret
可以看到,逻辑上有点优化。
因此,我建议把代码改为:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string a[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct",
"nov", "dec" };
string b[13] = { "", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy",
"lok", "mer", "jou" };
void func1(string s) {
int len = s.length(), num = 0;
for (int i = 0; i < len; i++)
num = num * 10 + (s[i] - '0');
if (num / 13) {
cout << b[num / 13];
if (num % 13)
cout << ' ' << a[num % 13];
}
else
cout << a[num % 13];
}
void func2(string s) {
int len = s.length(), num = 0;
if (len == 4) {
cout << 0;
return;
}
else if (len == 3) {
for (int i = 1; i <= 12; i++) {
if (s == a[i]) {
cout << i;
return;
}
if (s == b[i]) {
cout << i * 13;
return;
}
}
}
else {
string temp1 = s.substr(0, 3), temp2 = s.substr(4, 3);
for (int i = 1; i <= 12; i++) {
if (temp1 == b[i]) num += i * 13;
if (temp2 == a[i]) num += i;
}
cout << num;
}
return;
}
int main() {
int n;
cin >> n;
getchar();
for (int i = 0; i < n; i++) {
string s;
getline(cin, s);
if (isdigit(s[0]))
func1(s);
else
func2(s);
cout << endl;
}
return 0;
}