作者losepacific (Losepacific)
看板C_and_CPP
标题Re: [问题] 请问初学C语言推荐书(文长
时间Fri May 11 01:06:17 2018
※ 引述《Neisseria (Neisseria)》之铭言:
: 不预先将阵列排序的话,大概就是 O(n)
: 以下提供一个 C 的版本:
: #include <assert.h>
: #include <stddef.h>
: // Yet another linear search.
: #define max(sz, arr, out) do { \
: if (sz <= 1) { \
: out = arr[0]; \
: break; \
: } \
: out = arr[0]; \
: size_t i; \
: for (i = 1; i < sz; i++) { \
: out = arr[i] > out ? arr[i] : out; \
: } \
: } while (0);
: int main(void) {
: int arr_i[] = {4, 2, 5, 1, 3};
: int max_i;
: max(5, arr_i, max_i);
: assert(max_i == 5);
: float arr_f[] = {2.2, 3.3, 1.1, 5.5, 4.4};
: float max_f;
: max(5, arr_f, max_f);
: assert(max_f == 5.5);
: return 0;
: }
: 这是写好玩的,考试不要这样写,这样只是在搞自己
: 有写过一些 C 的就知道原因
看了大大的程式码才想到有可能会遇到小数。
所以修改了自己之前写的程式码,改完如下:
#include <stdio.h>
#include <stdlib.h>
float max(char**, int);
int main(int argc, char* argv[]){
printf("%f\n", max(argv+1, argc-1));
return 0;
}
float max(char** ap, int limit){
if (limit == 1) return atof(*ap) ;
float tmp;
return atof(*ap) > (tmp = max(ap+1, limit-1)) ? atof(*ap) : tmp;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.9.170.26
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1525971979.A.254.html
1F:→ losepacific: 忘了考虑不给参数的状况了!! 05/11 01:43
2F:嘘 KanzakiHAria: 当你个版? 05/11 05:13
3F:→ KanzakiHAria: 不会使用大E两篇合在一起? 05/11 05:14
好喔。
我有试着删多贴的文章,但这个版禁止个人自删,
那先把下篇文章的内容誊过来这边,
再麻烦板主们删文了(写在这边会他们会看到吗?)
下篇文章(多贴的):
========================
再修改:
#include <stdio.h>
#include <stdlib.h>
float max(char**, int);
int main(int argc, char* argv[]){
if (argc > 1) printf("%f\n", max(argv+1, argc-1));
return 0;
}
float max(char** ap, int limit){
if (limit == 1) return atof(*ap) ;
float a, b;
int frontside = limit/2;
int backside = limit-frontside;
return (a=max(ap, frontside)) >= (b=max(ap+frontside, backside))?a:b;
}
不过,浮点数很不可靠,测试的状况如下:
$ ./max 1 2 3 4.5 4 5 5.3 123213.131231 23.323 132424345655.6
132424343552.000000
===========================
另外,後来还想到,如果把函数写成返回指标,
输出就可能保有原本参数的格式。
在想如果要提高精确度,
可能要把字串从小数点的部分切开,
小数点前转成整数,
小数点後面转成浮点数。
先比较整数部分,再比较小数部分。
或者小数点後面反转字串存成整数,
从个位数开始比较。
※ 编辑: losepacific (39.9.170.26), 05/11/2018 21:05:14