励志用少的代码做高效的表达。
题目(提交)链接→UVa-1594
本题为水题,因此侧重点从解题转变为优化。
注意点:
1、下一轮是按照上一轮的每个数做运算,但下一轮每次运算都会改变数列的值,造成运算不准确,我的做法是:事先拷贝一个数列b,用数列b的值做运算,而后赋值给a。
2、我判断0序列的方法是:用#include<algorithm>
中的count()
函数,如果0的数量等于数组长度,则输出zero。循环直接结束。这样可以避免出现全为0仍然继续运算的情况。提高效率。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n; cin >> n; while(n--) { //n是序列个数
int m; cin >> m; //m是序列中元素数
int a[m+1], b[m+1]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); //a[m]存储元素,b[m]做拷贝 ,从1开始好循环
for(int i = 1; i <= m; i++) { cin >> a[i] ; b[i] = a[i]; } //输入a序列,拷贝b序列
int num = 0;
while(num++ < 1000) { //满1000次退出循环
for(int i = 1; i <= m; i++)
a[i] = abs(b[i]-b[(i+m)%m+1]); //取余。求绝对值
memcpy(b,a,sizeof(a)); //赋值
if(count(a+1,a+m+1,0) == m) { //如果0在a中的个数=m,则说明全部置0。
cout << "ZERO" << endl;
break;
}
}
if(num == 1001) cout << "LOOP" <<endl; //若遍历满1000次,说明是循环。
}
return 0;
}