基本上我試圖制作一個回圈遍歷給定陣列的程式,并檢查右側元素是否比左側元素大 2 倍,如果 true 插入這兩個元素的平均值在中間。之后,它列印出插入元素的陣列,然后再次遍歷陣列,計算某個數字出現的次數。我用筆和紙成功地編碼了所有這些,并將問題寫成更小的塊,然后用 C 編碼,但問題是當我輸入 100 個零(一百個零)時。程式列印出數字 0 重復了 200 次而不是 199。我不知道為什么。很抱歉代碼不好,我目前的任務是擅長用筆和紙解決問題,在我變得體面并發展我的邏輯后,我會嘗試使代碼更簡單。
Input sample:
Enter the number of elements: 100
Enter the array: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
After adding middle element: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002.33412e-310
The number is repeated 200 time/s
我的代碼
#include <math.h>
#include <stdio.h>
#define EPSILON 0.0001
int main() {
int n, i, j, k, digit, length = 0, digit_array[10] = {0};
double array[200], temp;
do {
printf("Enter number of elements: ");
scanf("%d", &n);
} while (n <= 0 || n >= 101);
printf("Enter elements: ");
length = n;
for (i = 0; i < length; i )
scanf("%lf", &array[i]);
for (i = 0; i < length; i ) {
temp = array[i] array[i];
if (fabs(temp - array[i 1]) < EPSILON) {
for (j = length; j > i 1; j--)
array[j] = array[j - 1];
array[i 1] = (array[i] array[i 1]) / 2.;
i ;
length ;
}
}
printf("After adding middle element: \n");
for (i = 0; i < length; i )
printf("%g ", array[i]);
for (i = 0; i < length; i ) {
temp = array[i];
digit = ((int)(temp * 10)) % 10;
digit_array[digit] ;
}
printf("\n");
for (i = 0; i < 10; i ) {
if (digit_array[i] != 0)
printf("Number %d is repeated %d time/s.\n", i, digit_array[i]);
}
return 0;
}
uj5u.com熱心網友回復:
與不斷移動陣列相比,使用兩個陣列更容易、更快捷。你只需要這個:
// Inputs:
// n: The number of inputs.
// a: An array of at least n doubles containing the inputs.
// b: An array of at least n*2-1 doubles that will containing the outputs.
// Outputs:
// m: The number of outputs.
// b: An array of at least m doubles containing the outputs.
size_t i = 0;
size_t j = 0;
double prev = b[j ] = a[i ];
while (i < n) {
double next = a[i];
if (fabs(prev*2 - next) < EPSILON) { // If a[i-1] exactly equal a[i]*2.
b[j ] = next / 2.0 prev / 2.0; // Or: b[j ] = prev * 1.5;
}
prev = b[j ] = a[i ];
}
size_t m = j;
關于prev * 1.5:
average(next, prev)
= ( next prev ) / 2
= ( prev * 2 prev ) / 2
= ( prev * 3 ) / 2
= prev * 1.5
包含在適當的函式中:
int f(double *a, size_t n, double **b_ptr, size_t *m_ptr) {
double b = malloc( (n*2-1) * sizeof(double) ); // We need up to this much.
if (b == NULL) {
*b_ptr = NULL;
return 0;
}
size_t i = 0;
size_t j = 0;
double prev = b[j ] = a[i ];
while (i < n) {
double next = a[i];
if (fabs(prev*2 - next) < EPSILON) { // If a[i-1] exactly equal a[i]*2.
b[j ] = next / 2.0 prev / 2.0; // Or: b[j ] = prev * 1.5;
}
prev = b[j ] = a[i ];
}
b = realloc(b, j * sizeof(double)); // Free the excess. (Optional)
size_t m = j;
*b_ptr = b;
*m_ptr = m;
return 1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338857.html
