数组逆序(难度系数:半颗星)

来源:互联网 发布:mac os 关闭自动更新 编辑:程序博客网 时间:2024/06/03 17:00

输入一个数组,把该数组的元素逆序,然后输出。

方法1:
使用异或的方法来进行交换,是一种很完美的方法,这种方法主要利用了异或的特性a^b的值先保存到a,因为a^b^b = a所以可以顺利完成交换。

参考代码:

#include <stdio.h>#include <malloc.h>int main(){    //使用异或的方法来进行交换,是一种很完美的方法,    //这种方法主要利用了异或的特性a^b的值先保存到a,因为a^b^b = a所以可以顺利完成交换。    int i, nLen, *arr = NULL;    printf("输入数组元素个数: ");    scanf_s("%d", &nLen);    printf("输入%d个元素: ", nLen);    arr = (int*)malloc(nLen * sizeof(int));    for (i = 0; i < nLen; i++)        scanf_s("%d", &arr[i]);    printf("\n反序前的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    for (i = 0; i < nLen / 2; i++)    {        arr[i] = arr[i] ^ arr[nLen - i - 1];        arr[nLen - i - 1] = arr[i] ^ arr[nLen - i - 1];        arr[i] = arr[i] ^ arr[nLen - i - 1];    }    printf("----------------------------------我是分割线------------------------------------");    printf("反序后的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    free(arr);    return 0;}

方法2:
使用加减法来进行交换,这种方法实际上就是先把a + b的结果暂时先保存在变量a中,然后通过这改变后的a和原始的b进行减法就可以得到交换后的b,但是这种方法有一个缺陷,就是a和b都是int类型,a + b的结果可以越界。

参考代码:

#include <stdio.h>#include <malloc.h>int main(){    //使用加减法来进行交换,这种方法实际上就是先把a + b的结果暂时先保存在变量a中,    //然后通过这改变后的a和原始的b进行减法就可以得到交换后的b,    //但是这种方法有一个缺陷,就是a和b都是int类型,a + b的结果可以越界。    int i, nLen, *arr = NULL;    printf("输入数组元素个数: ");    scanf_s("%d", &nLen);    printf("输入%d个元素: ", nLen);    arr = (int*)malloc(nLen * sizeof(int));    for (i = 0; i < nLen; i++)        scanf_s("%d", &arr[i]);    printf("\n反序前的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    for (i = 0; i < nLen / 2; i++)    {        arr[i] = arr[i] + arr[nLen - i - 1];        arr[nLen - i - 1] = arr[i] - arr[nLen - i - 1];        arr[i] = arr[i] - arr[nLen - i - 1];    }    printf("----------------------------------我是分割线------------------------------------");    printf("反序后的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    free(arr);    return 0;}

方法3:
使用乘除法来进行交换,这种方法和方法2类似,只是用a*b代替a+b放在a中暂存,后面思路一样,这种方法有着和方法2一样的缺陷,就是越界问题,而且更加容易越界

参考代码:

#include <stdio.h>#include <malloc.h>int main(){    //使用乘除法来进行交换,这种方法和方法2类似,只是用a*b代替a+b放在a中暂存,    //后面思路一样,这种方法有着和方法2一样的缺陷,就是越界问题,而且更加容易越界    int i, nLen, *arr = NULL;    printf("输入数组元素个数: ");    scanf_s("%d", &nLen);    printf("输入%d个元素: ", nLen);    arr = (int*)malloc(nLen * sizeof(int));    for (i = 0; i < nLen; i++)        scanf_s("%d", &arr[i]);    printf("\n反序前的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    for (i = 0; i < nLen / 2; i++)    {        arr[i] = arr[i] * arr[nLen - i - 1];        arr[nLen - i - 1] = arr[i] / arr[nLen - i - 1];        arr[i] = arr[i] / arr[nLen - i - 1];    }    printf("----------------------------------我是分割线------------------------------------");    printf("反序后的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    free(arr);    return 0;}

方法4:
使用移位的方法,把原来的int类型的a,把a的值拆分成高16位和低16位,相当于多了16位的暂存空间可以周转,但是此方法的缺陷也显而易见,就是如果被赋值的a或者b超过了16位,这种方法就会发生错误。

参考代码:

#include <stdio.h>#include <malloc.h>int main(){    //使用移位的方法,把原来的int类型的a,把a的值拆分成高16位和低16位,相当于多了16位的暂存空间可以周转,    //但是此方法的缺陷也显而易见,就是如果被赋值的a或者b超过了16位,这种方法就会发生错误。    int i, nLen, *arr = NULL;    printf("输入数组元素个数: ");    scanf_s("%d", &nLen);    printf("输入%d个元素: ", nLen);    arr = (int*)malloc(nLen * sizeof(int));    for (i = 0; i < nLen; i++)        scanf_s("%d", &arr[i]);    printf("\n反序前的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    for (i = 0; i < nLen / 2; i++)    {        arr[i] <<= 16;        arr[i] |= arr[nLen - i - 1];        arr[nLen - i - 1] = arr[i] >> 16;        arr[i] &= 0xffff;    }    printf("----------------------------------我是分割线------------------------------------");    printf("反序后的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    free(arr);    return 0;}

方法5:
因为题目没有说不能用临时变量,所以再加一种使用临时变量的方法

参考代码:

#include <stdio.h>#include <malloc.h>int main(){    //因为题目没有说不能用临时变量,所以再加一种使用临时变量的方法    int i, nTemp, nLen, *arr = NULL;    printf("输入数组元素个数: ");    scanf_s("%d", &nLen);    printf("输入%d个元素: ", nLen);    arr = (int*)malloc(nLen * sizeof(int));    for (i = 0; i < nLen; i++)        scanf_s("%d", &arr[i]);    printf("\n反序前的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    for (i = 0; i < nLen / 2; i++)    {        nTemp = arr[i];        arr[i] = arr[nLen - i - 1];        arr[nLen - i - 1] = nTemp;    }    printf("----------------------------------我是分割线------------------------------------");    printf("反序后的数组:\n");    for (i = 0; i < nLen; i++)        printf("%d ", arr[i]);    printf("\n");    free(arr);    return 0;}

运行结果:

这里写图片描述

3 0
原创粉丝点击