(散分)急!求一组数的周期
背景:现在有一组整形数,但是数据是否有周期不清楚。
问题:通过程序实现对数据周期进行判断,如果有周期,则计算出周期值,如果不是周期的,给出结论。
如: 1 , 4 , 3, 2, 4, 5 (无周期)
0 , 2, 0, 2, 0, 2 (有周期)
(注:事个数据只会是有周期和无周期状态,不存在在一个无周期中找出一个周期的情况,如(1, 2, 3, 2, 3, 4, 5)中的2, 3不作为考虑。)
(注:通过穷举法实现的不作考虑。)
[解决办法]
参考:
- C/C++ code
#include<iostream> #include<cstring>using namespace std;int calculate_cycle(int* arr, int length){ int i = 0; int j = 0; int cycle_length = 1;loop: for(i = 0; i < length / cycle_length; ++i) { for(j = 0; j < cycle_length; ++j) { if(*(arr + j) != *(arr + i * cycle_length + j)) { do { ++cycle_length; } while(length % cycle_length != 0); goto loop; } } } if((i == length / cycle_length) && (length != cycle_length)) { return cycle_length; // 返回周期长度 } return 0; // 如果没有周期性则返回0}int main(int argc, char* argv[]){ int a[] = {1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1}; int length = sizeof(a) / sizeof(a[0]); cout << calculate_cycle(a, length) << endl; return 0; }
[解决办法]
- C/C++ code
#include<iostream>#include<fstream>#include<vector>using namespace std;int calculate_cycle(int* arr, int length){ if(length %2 == 1) return 0; int beginIndex = 0,endIndex = length-1; int cycle_length = 0; vector<int> beginArray,endArray; for ( ;endIndex >= beginIndex;beginIndex ++,endIndex--) { beginArray.push_back(arr[beginIndex]); endArray.insert(endArray.begin(),arr[endIndex]); if (beginArray == endArray) { cycle_length = beginArray.size(); break; } } for (int i = beginIndex + 1;i<=endIndex ;i+=cycle_length) { for (int j = i,k=0;k<cycle_length;j++,k++) { if(arr[j]!=beginArray[k]) return 0; } } return cycle_length; }int main(){ int a[] = {2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,1}; int length = sizeof(a) / sizeof(a[0]); cout << calculate_cycle(a, length) << endl; return 0;}
[解决办法]