[编程之美]写一个函数,返回一个数组中所有元素被第一个元素除的结果

来源:互联网 发布:北京通州淘宝运营培训 编辑:程序博客网 时间:2024/05/17 08:44

后天要给小盆友们上算法课,就拿这个当例子讲下吧~~转载一篇别人的blog

题目

    写一个函数,返回一个数组中所有元素被第一个元素除的结果;

错误的版本:

[cpp] view plain copy
 print?
  1. void DivArray(int *array, int n)  
  2. {  
  3.     for (int i = 0; i < n; ++i)  
  4.     {  
  5.         array[i] /= array[0];  
  6.     }  
  7. }  

错误原因:在循环的第一步,第一个元素就变成了1,然后再用它去除以其他元素,就不符合题目要求了


改进:

1:使用其他变量保存第一个元素:

[cpp] view plain copy
 print?
  1. void DivArray3(int *array, int n)  
  2. {  
  3.     assert(array != NULL);//1:参数的检验  
  4.     assert(n > 0);  
  5.   
  6.     if (array[0] == 0)//2:除数不可以为0  
  7.     {  
  8.         cout << "除数不能为0" << endl;  
  9.         exit(1);//终止进程:参数为0,表示正常退出,非0表示异常退出  
  10.     }  
  11.   
  12.     int tmp = array[0];  
  13.     for (int i = 0; i < n; ++i)//3:陷阱  
  14.     {  
  15.         array[i] /= tmp;  
  16.     }  
  17. }  


不使用其他变量可以实现么,可以!

版本一:先处理其他元素,最后单独再处理第一个元素

[cpp] view plain copy
 print?
  1. <span style="font-family:KaiTi_GB2312;">void DivArray1(int *array, int n)  
  2. {  
  3.     assert(array != NULL);//1:参数的检验  
  4.     assert(n > 0);  
  5.   
  6.     if (array[0] == 0)//2:除数不可以为0  
  7.     {  
  8.         cout << "除数不能为0" << endl;  
  9.         exit(1);//终止进程:参数为0,表示正常退出,非0表示异常退出  
  10.     }  
  11.   
  12.     for (int i = 1; i < n; ++i)//3:陷阱  
  13.     {  
  14.         array[i] /= array[0];  
  15.     }  
  16.     array[0] /= array[0];  
  17. }</span>  

版本二:循环倒着写:for(int i = n-1;i>=0;--i)

[cpp] view plain copy
 print?
  1. void DivArray2(int *array, int n)  
  2. {  
  3.     assert(array != NULL);  
  4.     assert(n > 0);  
  5.   
  6.     if (array[0] == 0)  
  7.     {  
  8.         cout << "除数不能为0" << endl;  
  9.         exit(1);  
  10.     }  
  11.   
  12.     for (int i = n - 1; i >= 0;--i)  
  13.     {  
  14.         array[i] /= array[0];  
  15.     }  
  16. }  


void assert(int expression)

功能:在函数开始处检验传入参数的合法性

参数:表达式expression为假,终止程序运行,为真继续执行程序

assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。


assert具体用法:点击打开链接

void exit(int status)
功 能: 关闭所有文件,终止正在执行的进程。
参 数:参数为0,表示正常退出,非0表示异常退出


exit具体用法点击打开链接


注意事项:

1:函数的参数要进行检验:assert()

2:特殊情况的处理:除数不能为0,根号下的范围>=0,范围的检验

3:倒着写循环的运用:本例,数组中插入元素(从后往前依次移动)

0 0
原创粉丝点击