Re: [問題] 請問初學C語言推薦書(文長
看板C_and_CPP (C/C++)作者losepacific (Losepacific)時間7年前 (2018/05/11 01:06)推噓-1(0推 1噓 2→)留言3則, 2人參與討論串5/7 (看更多)
※ 引述《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://www.ptt.cc/bbs/C_and_CPP/M.1525971979.A.254.html
→
05/11 01:43,
7年前
, 1F
05/11 01:43, 1F
噓
05/11 05:13,
7年前
, 2F
05/11 05:13, 2F
→
05/11 05:14,
7年前
, 3F
05/11 05:14, 3F
好喔。
我有試著刪多貼的文章,但這個版禁止個人自刪,
那先把下篇文章的內容謄過來這邊,
再麻煩板主們刪文了(寫在這邊會他們會看到嗎?)
下篇文章(多貼的):
========================
再修改:
#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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章