07 有趣的跳跃
题目描述:
输入:一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000,000,000。输出一行,若该序列存在“有趣的跳跃”
输出"Jolly",否则输出"Not jolly"。
思路:第一个for循环输入相应个数的整数~第二个for循环求输入的相邻数之间的差的绝对值~对求得的差值进行排序~第三个for循环进行jolly判断:
排好序的差值相邻两数字后减前一个数的和若为jolly应=n-2;
阻碍:1,求两数字之差的绝对值的函数:c=abs(a-b)~a b c都为整型
2 排序:冒泡排序:注意i=1还是i=0
3 i:是从0开始还是从1开始很重要!:因为从1开始后面两两相减的话可能会有溢出的数组!!
4 注意n=1的情况:永远为Jolly
1 #include<stdio.h> 2 #include<stdlib.h> 3 //三个for循环 4 int main(){ 5 int n=0; //序列的长度 6 int a[3010],b[3010]; //定义两个数组,一个接收输入的数,一个接收两数字之间的差值 7 scanf("%d",&n); 8 9 10 //第一个for循环:输入n个数 11 for(int i=0;i<n;i++){ 12 scanf("%d",&a[i]); 13 } 14 15 //n=1:任何只包含单个元素的序列一定存在“有趣的跳跃” 16 if(n==1) 17 printf("Jolly"); 18 else if(n>1){ 19 20 21 //第二个for循环:求输入数两两之间的差值 22 for(int i=0;i<n-1;i++){ //输入n个数则会有n-1个差值 23 b[i]=abs(a[i]-a[i+1]); 24 } 25 26 // //排序差值 27 // for(int i=1;i<=n-2;i++){ 28 // int min=b[i],q=i; 29 // for(int j=i;i<=n-1;j++){ 30 // if(b[j]<min){ 31 // min=b[j]; 32 // q=j; 33 // } 34 // } 35 // int tem; 36 // tem=b[i]; 37 // b[q]=tem; 38 // b[i]=b[q]; 39 40 // } 41 // for (int i = 1; i <= n-1; i++) 42 // { 43 // if(i != b[i]){ 44 // printf("Not Jolly"); 45 // return 0; 46 // } 47 // } 48 // printf("Jolly"); 49 // return 0; 50 51 52 //冒泡排序对求出来的差值进行由小到大的排序 53 //待排序数字:n-1个 54 int min=0; 55 for(int i=0;i<n-1;i++){ //一共排序n-1轮 56 for(int j=1;j<n-1;j++){ 57 if(b[j]<b[j-1]){ 58 min=b[j]; 59 b[j]=b[j-1]; 60 b[j-1]=min; 61 } 62 } 63 } 64 65 //第三个for循环:jolly判断 66 int flag=0; 67 for(int i=0;i<n-1;i++){ 68 if(b[i+1]-b[i]==1) 69 flag++; 70 else 71 break; 72 } 73 if(flag==n-2) 74 printf("Jolly"); 75 else 76 printf("Not jolly"); 77 } 78 79 return 0; 80 }