数组逆序(难度系数:半颗星)
来源:互联网 发布: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
- 数组逆序(难度系数:半颗星)
- 数列的逆序数对(难度系数:2颗星)
- 水仙花数(难度系数:半颗星)
- 完数(难度系数:半颗星)
- 回文数(难度系数:半颗星)
- 偶数的个数(难度系数:半颗星)
- 倒数之和(难度系数:半颗星)
- 平方和立方(难度系数:半颗星)
- 回文字符串(难度系数:半颗星)
- 随机生成数字放入数组(难度系数:1颗星)
- 计算π的值(难度系数:半颗星)
- 修改百位上的值(难度系数:半颗星)
- 计算器(难度系数:3颗星)
- 输出图案(一)----输出三角形图案:(难度系数:小于半颗星)
- 图案输出(二)----输出平行四边形图案:(难度系数:小于半颗星)
- 输出图案(四)----输出正多边形图案:(难度系数:半颗星)
- 拼音读数字(难度系数:1颗星)
- 加减乘除24点(难度系数:2颗星)
- 类型转换
- 【POJ1986】Distance Queries(lca的应用)
- PHP语言基础知识(学习笔记)
- 设计模式学习之简单工厂模式
- lesson6.4Integer类以及如何设置命令行参数
- 数组逆序(难度系数:半颗星)
- Mac通过Docker部署Gitlab实践
- 自动化运维使用cobbler实现大PXE
- 9-Palindrome Number -C++
- java的Io体系结构
- 异常解析家族应用点源码讲解:SpringMVC全局异常捕获及SpringMVC文件上传报错的优雅解决方式以及@Exception拦截异常注意点
- Java 多线程基础-基本概念
- warning: LF will be replaced by CRLF in public/js/plugins/tablesorter/jquery.met
- Convert BST to Greater Tree