描述
一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1)。例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1。当然,任何只包含单个元素的序列一定存在“有趣的跳跃”。你需要写一个程序判定给定序列是否存在“有趣的跳跃”。
输入
一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000,000,000。
输出
一行,若该序列存在“有趣的跳跃”,输出"Jolly",否则输出"Not jolly"。
样例输入
4 1 4 2 3
样例输出
Jolly
思路:
一.把相邻数值的差存入一个数组里面
二.对数组进行从大到小的判断
三.判断该数组值有没有从1-(n-1)的数,有则存在
代码
#include <stdio.h>
#include <math.h>
int main() {
int n,i;
scanf("%d",&n);
int a[n]; if(n==1) printf("Jolly");//判断是否是单元素
for(i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
int b[n-1];//这里注意一下数组b的长度
for(i=1;i<=n-1;i++) {
b[i]=abs(a[i+1]-a[i]);//注意数组a的范围
}
for(i=1;i<n-1;i++)//从小到大选择排序,当然还有冒泡排序等等
{
for(int j=i+1;j<n;j++) { int temp; if(b[i]>b[j]) { temp=b[i]; b[i]=b[j]; b[j]=temp; } } printf("%d",b[i] );//这里输出数组b,方便我们判断程序是否正确 } printf("\n"); for(i=1;i<n;i++) { if(b[1]==1&&b[i+1]-b[i]==1) { continue;//continue是不断执行下一条循环 } else { break;//直接退出循环 //因为数组b已经排序了,最小值肯定必须是1,后面也必须是连接 } } if(i==n-1) printf("Jolly");//因为i作用域是整个main函数,所以最后的i的值是最后一个循环停下来的值 else printf("Not Jolly"); }