Ducci 序列
题意:
对于一个n元组(a1,a2,……an),可以对于每个数求出它和下一个数的差的绝对值,得到一个新的n元组(|a1-a2|,|a2-a3|,……|an-a1|)。重复这个过程,得到的序列称为Ducci序列,例如:
(8,11,2,7)—>(3,9,5,1)-->(6,4,4,2)-->(2,0,2,4)-->(2,2,2,2)-->(0,0,0,0)
也有的Ducci序序列会循环,输入n元组(3<=n<=15),你的任务就是判断它最终会变成0还是会循环,输入保证最多1000步就会变成0或者循环。
Sample Input
4 4 8 11 2 7 5 4 2 0 2 0 7 0 0 0 0 0 0 0 6 1 2 3 1 2 3
Sample Output
ZERO LOOP ZERO LOOP
思路分析:
用循环,依次相减,取绝对值。每循环完一次就判断是否全部为0(这里可以定义两个同等长度的数组,作为比较的那个数组可以全部赋值为0),
否则一直循环,直到1000次结束,可判断为循环。详细代码如下:
1 #include<iostream> 2 #include<vector> 3 #include<cmath> 4 using namespace std; 5 vector<int>ad; //定义两个不定长数组 6 vector<int>aa; 7 int main() 8 { 9 int t; 10 cin >> t; 11 while (t--) 12 { 13 int n, a = 0; 14 cin >> n; 15 ad.resize(n); //两个数组的长度 16 aa.resize(n); 17 for (int i = 0; i < n; i++) 18 { 19 cin >> ad[i]; //输入两个数组,并把其中一个数组全部归0 20 aa[i] = 0; 21 } 22 for (int i = 1; i <= 1000; i++) 23 { 24 int k = 0; 25 k = ad[0]; //把第一数先存起来,以便后面的an-a1. 26 for (int j = 0; j < n - 1; j++) 27 { 28 29 ad[j] = abs(ad[j] - ad[j + 1]); 30 } 31 ad[n - 1] = abs(k - ad[n - 1]); 32 33 if (ad == aa) //判断此时是否全部的数都变成0了 34 { 35 a = 1; 36 cout << "ZERO" << endl; 37 break; 38 39 } 40 41 } 42 if (a == 0) //Ducci序列一直在循环,输出LOOP 43 cout << "LOOP" << endl; 44 } 45 //system("pause"); 46 return 0; 47 }
心得:需要判断的时候可以加个标志性语句,如flag=0或者flag=1;比较的时候可以加个一样的数组,如本题,就不用每一个都去比较一次,减少代码的数量。这个题的难度还好,哈哈,加油加油~~Nonoha
------------------------
没有谁的人生不是斩棘前行
----------------------------------------
JM