2017-07-30 36 views
-2

两个整数分别存储在数组a1和a2中,产品的计算过程与计算过程相同,但不会输出正确的结果。 问题是:想要产生312 * 321 = 1 0 0 1 5 2,但是这第一个程序产生 ? 0 9 9 11 5 2 以产生正确的结果1 0 0 1 5 2,呼叫功能名称func(C,N * 2)c程序查找调用函数

#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 5 2

   |0|1|2| ->A1 
    ---------------- 
A2<-| 0|2|4|6|  
    | 1|1|2|3| 
    | 2|3|6|9| 

这个数组与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,我只能修改c数组,因为它是唯一传递给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

Thankyou !!!!我能问一下这个背后的逻辑吗?你怎么知道你必须除以10找到剩余的?我在这里知道每次数字大于9时都有一个数字,但我不知道如何使程序产生该数字 – fiksx

+0

更改逻辑:“如果数字大于9,则有进位” - >“总是有携带偶数0“。它会使它变得简单。 –

+0

这里的模式是当2进位为0时,当5进位为0时,当11进位为1且仅显示最后一位数时11%10为1,所以当9-> 9 + 1(进位)所以进位为1想显示最后一个数字,所以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

Thankyou这里为什么需要初始化c?除此之外,你是否从运载中找到了pattarn? – fiksx

+0

@DevinaMuljono否则,'a [5]'将具有随机的初始诠释值,必须专门处理。 – aristotll

+0

啊好吧我知道了,因为c [5]没有价值。除了c [0] = b [0] [0] ....还有另外一种写入循环的方法吗?为了在循环中编写它,你还必须找到模式? – fiksx