2017-07-30 37 views
-2

2つの整数がそれぞれa 1とa 2の配列に格納され、計算と同じ手順で計算されますが、正しい結果は出力されません。 質問は:312 * 321 = 1 0 0 1 5 2を生成したいが、この最初のプログラムは を生成する? 0 9 9 11 10 2cプログラム呼び出し関数の呼び出し

   |0|1|2| ->A1 
    ---------------- 
A2<-| 0|2|4|6|  
    | 1|1|2|3| 
    | 2|3|6|9| 
:1 0 0 1 5 2、関数名funcを呼び出す(C、N * 2)

#include <stdio.h> 
#include <stdlib.h> 
#define N 3 
int main() 
{ 

int a1[N]={1,2,3}; 
int a2[N]={2,1,3}; 
int b[N][N]; 
int c[N*2]; 
int i,j; 

for(i=0;i<N;i++){ 
    for(j=0;j<N;j++) 
b[i][j]=a1[j]*a2[i]; 
} 


c[0]=b[0][0]; 
c[1]=b[0][1]+b[1][0]; 
c[2]=b[0][2]+b[1][1]+b[2][0]; 
c[3]=b[1][2]+b[2][1]; 
c[4]=b[2][2]; 

for(i=N*2-1;i>=0;i--) 
{ 
    printf("%d ",c[i]); 
} 
    printf("\n"); 
    return 0; 
} 

結果を正しい結果を生成するための0から9 9 11 10 2

この配列は321と同じ* 312紙で手を使用して計算する

問題:関数func()を定義して正しい結果を出力する。1 0 0 1 5 2、call func(c、N * 2);私は太字のコール関数func()でコードを投稿します。何か案が??また、func()の背後にある論理は何ですか?試行錯誤?これの背後にアルゴリズムがありますか?

#include <stdio.h> 
#include <stdlib.h> 
#define N 3 
int main() 
{ 

int a1[N]={1,2,3}; 
int a2[N]={2,1,3}; 
int b[N][N]; 
int c[N*2]; 
int i,j; 

for(i=0;i<N;i++){ 
    for(j=0;j<N;j++) 
b[i][j]=a1[j]*a2[i]; 
} 


c[0]=b[0][0]; 
c[1]=b[0][1]+b[1][0]; 
c[2]=b[0][2]+b[1][1]+b[2][0]; 
c[3]=b[1][2]+b[2][1]; 
c[4]=b[2][2]; 

**func(c,N*2);** 

for(i=N*2-1;i>=0;i--) 
{ 
    printf("%d ",c[i]); 
} 
    printf("\n"); 
    return 0; 
} 

**void func(int a[],int digit) 
{ 
    here no idea.... 
    }** 
+0

のように見えるそれはあなたがになっていると思われる

まず初期化を渡された配列を変更して、値を出力するときに正しい結果が得られるようにします。私はあなたが何をしようとしているかを正確に理解するのに苦労しています。 –

+0

ここでは、cの配列は0 9 9 11 5 2結果ですが、func関数を呼び出して1 0 0 1 5 2を生成しなければならないので、funcに渡された唯一の配列であるため、関数。しかし、私はそれを変更する方法を知らない、論理を取得しないでください – fiksx

答えて

0

これで試してみてください。

私はあなたが二つのものに変更すべきだと思う
void func(int a[], int digit) 
{ 
    int i, c = 0; 
    for(i = 0; i < digit; i ++) 
    { 
     a[i] += c; 
     c = a[i]/10; 
     a[i] = a[i] % 10; 
    } 
} 
+0

ありがとう!!私はこの背後にある論理を尋ねることができますか?あなたは10で割って残りを見つけなければならないことをどのように知ることができますか?私はここで、9桁以上の数字があることを知っていますが、数字の桁上げがありますが、そのプログラムを作る方法を理解していません。 – fiksx

+0

論理を変更してください: "数字が9より大きい場合はキャリーがあります" - > 0を運んでください "。それは簡単になります。 –

+0

ここでのパターンは、2キャリーが0のとき、5キャリーが0のとき、11キャリーが1で最後の桁のみを表示するときであるから、9 - > 9 + 1(キャリー)のとき11%最後の桁を表示したいので10%10は0 ,,, ..ここにロジックがありますか? – fiksx

0

:結果の配列も

int c[N * 2] = {0}; //initialize 

は機能が

void func(int a[], int size) { 
    int carry = 0; 
    for (int i = 0; i < size; i++) { 
     a[i] += carry; 
     carry = a[i]/10; 
     a[i] = a[i] % 10; 
    } 
} 
+0

ここでありがとう、ここでなぜCを初期化する必要がありますか?それ以外に、キャッチからパタンを見つけるのですか? – fiksx

+0

@DevinaMuljonoそうでなければ、 'a [5]'はランダムな初期int値を持ち、特に扱われなければなりません。 – aristotll

+0

ああ、私はそれを持っています。[5]価値がありません。それ以外にも、c [0] = b [0] [0] ....これはループで書く別の方法ですか?それをループで書くにはパターンも見つけなければなりませんか? – fiksx

関連する問題