【代码问题分析】
你提供了两段代码,分别是将条件判断语句放在外层循环和内层循环的位置。让我们进行一下分析:
第一段代码:#include <bits/stdc++.h>using namespace std;int main() { string s; while(cin >> s, s != ".") { int len = s.size(); for(int n = len; len % n == 0; n--) { int t = len / n; string a; for(int i = 0; i < n; i++) { a += s.substr(0, t); } if(s == a) { cout << n << endl; break; } } }}
第二段代码:#include <bits/stdc++.h>using namespace std;int main() { string s; while(cin >> s, s != ".") { int len = s.size(); for(int n = len; n; n--) { if(len % n == 0) { int t = len / n; string a; for(int i = 0; i < n; i++) { a += s.substr(0, t); } if(s == a) { cout << n << endl; break; } } } }}
【代码问题原因】
这两个版本的代码在逻辑上其实是等价的,应该得到相同的结果。然而,两个版本的代码细微的差异可能导致不同的执行结果,并且两者的性能也略有不同。
问题可能出在这一行代码:for(int n = len; len % n == 0; n--)
和在第一段代码中,外层循环的条件是len % n == 0,也就是说只会进入满足条件的情况下的循环。而在第二段代码中,外层循环的条件是n,在这种情况下,外层循环不仅在len % n == 0时执行,还包括了其他情况。
因此,如果输入的字符串len不是一个约数,两个版本的代码就会有不同的行为。
【建议修改方式】
为了保证两个版本的代码结果一致,可以将第二段代码修改为:#include <bits/stdc++.h>using namespace std;int main() { string s; while(cin >> s, s != ".") { int len = s.size(); for(int n = len; n; n--) { if(len % n == 0) { int t = len / n; string a; for(int i = 0; i < n; i++) { a += s.substr(0, t); } if(s == a) { cout << n << endl; break; } } } }}
这样,两个版本的代码应该得到相同的结果。
球一个最佳答案谢谢啦!这对我非常重要! |