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

 






















 

posted @ 2015-07-24 19:54  白一  阅读(636)  评论(0编辑  收藏  举报