我寫了一小段代碼來檢查字符串相似性百分比。它看起來像:字符串相似性算法返回假值
int similarity(std::string s1, std::string s2) {
int size = 0, sim = 0;
if(s1==s2) {
sim = 100;
} else {
if(s1 > s2)
size = s2.size();
else
size = s1.size();
for(int i = 0; i != (size); ++i) {
if(s1[i] == s2[i])
++sim;
}
}
return (sim/s2.size()>s1.size()?s2.size():s1.size())*10;
}
和我一樣,(我已經添加了這些「DDDD」,使字符量= 10)的主要功能測試:
std::cout << "Similarity of gananadddd and bananadddd (%): " << std::endl;
std::cout << similarity("gananadddd", "bananadddd") << "%" << std::endl;
和控制檯輸出:
Similarity of gananadddd and bananadddd (%):
100%
因此,我認爲我的代碼不能很好地工作,因爲:
- 百分比不應該是100%,因爲只改變了一個字母。
- 在我注意到此輸入百分比可能爲1000%之前的某個時間,如果我將
return (sim/s2.size()>s1.size()?s2.size():s1.size())*10;
更改爲return (sim/s2.size()>s1.size()?s2.size():s1.size())*100;
。實際上它應該是100!
我會很高興的是有人會指出我犯了錯誤的地方。另外,我可以考慮改變算法
編輯:
我修改的代碼位:
double similarity(std::string s1, std::string s2) {
int size = 0, sim = 0;
if(!s1.compare(s2)) {
return 100;
} else {
if(!s2.compare(s1) < 0)
size = s2.size();
else
size = s1.size();
for(int i = 0; i != (size); ++i) {
if(s1[i] == s2[i])
++sim;
}
}
return sim/((s2.size()>s1.size())?s2.size():s1.size())*100;
}
..和現在得到0%...
'SIM/s2.size()'使用整數除法和產量'0'始終。即使沒有這些,爲了實現它,它需要'sim> s1.size()* s2。大小()',我不明白怎麼可能發生 – user463035818
後三次(也許四個)閱讀它,我想我知道什麼樣的回報應該做的。你想寫'sim /((s2.size()> s1size)?s2.size():s1.size())'?注意括號中的三元組。不是100%肯定的,但我相信'/'比'>'具有更高的優先級。 – user463035818
... btw返回一個'int'沒有太大的意義。我會直接返回'sim'並讓用戶根據需要計算百分比,或者返回一個'double' – user463035818