0
我如何找到平均值,一組數字的中位數而不使用C中的數組? 問題不是找到平均數或中位數的方法,而是如何存儲一組數字並對它們執行一些操作(如果不允許使用數組)?查找平均值,中位數不使用數組
我如何找到平均值,一組數字的中位數而不使用C中的數組? 問題不是找到平均數或中位數的方法,而是如何存儲一組數字並對它們執行一些操作(如果不允許使用數組)?查找平均值,中位數不使用數組
一個有趣的問題。
尋找一個地方來存儲所有數字的關鍵。代碼可以使用文件,鏈接列表等。下面使用鏈表和遞歸。
當count
是偶數時,將其留給OP以便對多種模式或中位數進行優化。
typedef struct num_S {
struct num_S *prev;
double x;
} num_T;
void GetNum(num_T *prev) {
num_T current;
current.prev = prev;
// If new number found ...
if (scanf("%lf", ¤t.x) == 1) {
num_T *p = ¤t;
// Sort new entry into list
while (p->prev != NULL && p->x < p->prev->x) {
double t = p->x;
p->x = p->prev->x;
p->prev->x = t;
p = p->prev;
}
GetNum(¤t);
// End of list -now process the list
} else {
unsigned ModeCount = 0;
double Mode = 0.0;
unsigned ModeCandidateCount = 0;
double ModeCandidate = 0.0/0.0;
unsigned Count = 0;
double SumX = 0.0;
double SumXX = 0.0;
num_T *p = current.prev;
while (p != NULL) {
Count++;
SumX += p->x;
SumXX += p->x * p->x;
if (p->x == ModeCandidate) {
ModeCandidateCount++;
} else {
ModeCandidateCount = 1;
ModeCandidate = p->x;
}
if (ModeCandidateCount > ModeCount) {
ModeCount = ModeCandidateCount;
Mode = p->x;
}
p = p->prev;
}
printf("Count = %u\n", Count);
if (Count > 0) {
printf("Mode = %lf Count %u\n", Mode, ModeCount);
printf("Mean = %lf\n", SumX/Count);
printf("STD = %lf\n", sqrt(Count * SumX - SumXX)/Count);
Count /= 2;
num_T *p = current.prev;
while (Count-- > 0) {
p = p->prev;
}
printf("Median = %lf\n", p->x);
}
fflush(stdout);
}
}
int main(void) {
GetNum(NULL);
return 0;
}
輸入4 3 4 2 4 1 EOF
輸出:
Count = 6
Mode = 4.000000 Count 3
Mean = 3.000000
STD = 1.130388
Median = 3.000000
然後使用一個鏈表。或者如果只有少數數字,則將它們全部作爲函數的參數傳遞。 – 2014-11-23 16:01:33
那麼數字是如何存儲的?以什麼格式?一份文件? – jlandercy 2014-11-23 16:06:07
獲取每個數字一個接一個。將它們中的每一個添加到變量sum中,並將另一個變量count加1。除以總和/計數。你得到的意思是 – 2014-11-23 16:10:59