読者です 読者をやめる 読者になる 読者になる

ITP1_10_D: Distance II

AOJ

問題

ソースコード

#include <stdio.h>
#include <math.h>

int main()
{
    int i;

    int n;
    scanf("%d", &n);
    int x[n], y[n];
    for( i = 0; i < n; ++i )
        scanf("%d", &x[i]);
    for( i = 0; i < n; ++i )
        scanf("%d", &y[i]);

    int p;
    double D;
    for( p = 1; p < 4; ++p ){
        D = 0;
        for( i = 0; i < n; ++i )
            D += (double)(pow(fabs(x[i] - y[i]), p));
        D = (double)pow(D, 1.0/p);
        printf("%lf\n", D);
    }

    D = 0;
    for( i = 0; i < n; ++i ){
        double tmp = (double)(fabs(x[i] - y[i]));
        D = D < tmp ? tmp : D;
    }
    printf("%lf\n", D);

    return 0;
}

つまづいた点

        D = (double)pow(D, 1.0/p);

pow()はdouble型なのでキャスト必要ないですね,今気付きました.

それはさておき,問題なのは "1/p" です.
int p; → double p;
または
1 → 1.0
としなければなりません.
最初は (double)(1/p) としていましたが,演算の時点ではint型になってしまい,誤った値を扱ってしまいます.
int型の結果をdouble型にキャストするのではなく,double型で結果を出してもらわねばなりませんでした.
ミンコフスキー距離において(恐らく) p∈N であるから,今回は int p; とし,1を1.0としてdouble型にしました.