3

StackOverflow に関する最初の質問...C と Pascal の 2 つのプログラムがあり、同じ出力が得られるはずですが、そうではありません。

パスカル:

program ssgf108;
uses crt;
var n,q,r,s,i:integer;
var a:array[1..10] of integer;

begin
        a[1]:=3;
        a[2]:=-5;
        a[3]:=12;
        a[4]:=7;
        a[5]:=-4;
        a[6]:=-3;
        a[7]:=2;
        a[8]:=8;
        a[9]:=4;
        a[10]:=10;
        readln(n);
        q:=0;
        r:=0;
        s:=1;
        for i:=1 to n do
        begin
                q:=i*a[i];
                r:=i+a[i];
                s:=s+q*r;
        end;
        writeln(q,' ',r,' ',s);
end.

子:

#include <stdio.h>

int main(){
        int a[10],n,q,r,s,i;
        scanf("%d",&n);
        a[0]=3;
        a[1]=-5;
        a[2]=12;
        a[3]=7;
        a[4]=-4;
        a[5]=-3;
        a[6]=2;
        a[7]=8;
        a[8]=4;
        a[9]=10;
        q=0;
        r=0;
        s=1;
        for (i=0;i<=n-1;i++){
                q=i*a[i];
                r=i+a[i];
                s=s+q*r;
        }
        printf("%d %d %d",q,r,s);
        return 0;
}

n として 5 を入力すると、Pascal は -20 1 871 を出力し、C は -16 0 567 を出力します。エラーはどこにあるのでしょうか? この質問の背景: 私は学校で問題解決コンテストを行っています。次の課題は近いです。プログラミングが必要な質問もあります。最初の 2 つの課題は Bash と Pascal で行いました。現在は C を学んでいるので、 C でそれらを行うのが好きですが、ポイントを失うことを意味するため、間違った結果を避ける必要があります。これは、コンテストのサイトで、疑似コードをコードに変換するためのトレーニングです。

4

1 に答える 1

3

その価値

q = i * a[i];
r = i + a[i];

iループ内の値に依存します。これは、1 ベースのインデックス ループと 0 ベースのインデックス ループの間で異なります。i+1C ループ内で演算を行う必要があります。

for (i = 0; i < n; i++) {
    int i1 = i + 1;
    q = i1 * a[i];
    r = i1 * a[i];
    s += q * r;
}
于 2013-03-17T18:38:24.817 に答える