7-44 基于词频的文件相似度 (30分)--map

代码来源

 1 #include<iostream>
 2 #include <map>
 3 #include <iomanip>
 4 #include <string>
 5 #include <cstring>
 6 using namespace std;
 7 map<string, bool>m[101];//如果第i个文件存在单词word,则m[i][word] = true;
 8 int same[101][101] = { 0 };
 9 int num[101] = { 0 };
10 int main()
11 {
12     int N;
13     cin >> N;
14     for (int i = 1; i <= N; i++)
15     {
16         char ch;
17         int cnt = 0;
18         char t_word[11];
19         while ((ch = toupper(cin.get())) != '#')//统一转换为大写字母
20         {
21             if (ch >= 'A' && ch <= 'Z')
22             {
23                 if (cnt < 10) t_word[cnt++] = ch;/*如果cnt>=10,则cnt不会增加,停留在第10个字母后边,
24                                                  直至遇到第一个非字母时将t_word[cnt]置为'\0'*/
25             }
26             else
27             {
28                 t_word[cnt] = '\0';
29                 if (cnt >= 3)
30                 {
31                     m[i][t_word] = true;
32                 }
33                 cnt = 0;
34             }
35         }
36         map<string, bool>::iterator it;
37         for (it = m[i].begin(); it != m[i].end(); it++)
38         {
39             for (int j = 0; j < i; j++)//判断是否有相同的单词,每有一个sam[i][j]就加一
40             {
41                 if (m[j][it->first] == true)
42                     same[i][j] = same[j][i] += 1;
43                 else
44                     same[i][j] = same[j][i] += 0;
45             }
46         }
47         same[i][i] = num[i] = m[i].size();
48     }
49     int M;
50     cin >> M;
51     for (int i = 0; i < M; i++)
52     {
53         int a, b;
54         cin >> a >> b;
55         cout << fixed << setprecision(1) << same[a][b] * 100.0 / (1.0 * (num[a] + num[b] - same[a][b])) << '%' << endl;
56     }
57     return 0;
58 }

 

上一篇:谭浩强C++课后习题44——对二进制文件的操作(1)


下一篇:关于sysdate()函数不能使用索引的问题