【问题标题】:Last element of array changes itself to first element of another array数组的最后一个元素将自身更改为另一个数组的第一个元素
【发布时间】:2017-06-23 06:09:44
【问题描述】:

所以问题陈述是编写一个代码来找到两个数组的最小乘积和,即,将相同索引中的值相乘并相加。并且第一个数组中的元素最多可以更改k次为+2或-2。

我的代码是:

#include<stdio.h>
#include<stdlib.h>

long diffn(long i,long k,long *a,long *b)
    {
        long val1 , val2 ;
        val1 = (a[i]-(2*k))*b[i] ;
        val2 = a[i] * b[i] ;
        return(val2-val1);
    }

long diffp(long i,long k,long *a,long *b)
    {
        long val1 , val2 ;
        val1 = (a[i]+(2*k))*b[i] ;
        val2 = a[i] * b[i] ;
        return(val2-val1);
    }

int main()
    {
        long n , k , i , mi , val , pn , *a , *b , flag ;
        a = (long*)malloc(n*sizeof(long));
        b = (long*)malloc(n*sizeof(long));
        scanf("%li %li",&n,&k);
        for(i=0;i<n;i++)
            scanf("%li",&a[i]);
        for(i=0;i<n;i++)
            {
                scanf("%li",&b[i]);
                flag = 0 ;
                if(i==0)
                    {
                        mi = i ;
                        if(a[i]*b[i]>0)
                            pn = 1 ;
                        else
                            pn = -1 ;
                    }
                else
                    {
                        if((diffp(i,k,a,b)>diffn(i,k,a,b))&&(pn==1)&&(diffp(i,k,a,b)>diffp(mi,k,a,b))&&(flag==0))
                            {
                                mi = i ;
                                pn = 1 ;
                                flag = 1 ;
                            }
                        if((diffp(i,k,a,b)>diffn(i,k,a,b))&&(pn==-1)&&(diffp(i,k,a,b)>diffn(mi,k,a,b))&&(flag==0))
                            {
                                mi = i ;
                                pn = 1 ;
                                flag = 1 ;
                            }
                        if((diffp(i,k,a,b)<diffn(i,k,a,b))&&(pn==1)&&(diffn(i,k,a,b)>diffp(mi,k,a,b))&&(flag==0))
                            {
                                mi = i ;
                                pn = -1 ;
                                flag = 1 ;                              
                            }
                        if((diffp(i,k,a,b)<diffn(i,k,a,b))&&(pn==-1)&&(diffn(i,k,a,b)>diffn(mi,k,a,b))&&(flag==0))
                            {
                                mi = i ;
                                pn = -1 ;
                                flag = 1 ;                              
                            }
                    }
            }
        printf("mi = %ld",mi);
        printf("\na : ");
        for(i=0;i<n;i++)
            printf("%ld ",a[i]);
        printf("\nb : ");
        for(i=0;i<n;i++)
            printf("%ld ",b[i]);
        if(pn==-1)
            a[mi] = a[mi] - (2*k) ;
        else
            a[mi] = a[mi] + (2*k) ;
        val = 0 ;
        printf("\na : ");
        for(i=0;i<n;i++)
            printf("%ld ",a[i]);
        printf("\nb : ");
        for(i=0;i<n;i++)
            printf("%ld ",b[i]);
        for(i=0;i<n;i++)
            val = val + (a[i]*b[i]);                                    
        printf("\nval=%ld",val);                    
        return 0 ;
    }

现在,这完全是随机的。我有时会在第一个数组之后出现分段错误,否则程序运行并且数组的最后一个元素成为下一个元素中的第一个。我只是不明白我要去哪里。

请帮忙!

这是输出,我根本没有在运行之间更改代码

divya@divya-Aspire-V3-574G:~$ ./a.out
5 3
2 3 4 5 4
Segmentation fault (core dumped)


divya@divya-Aspire-V3-574G:~$ ./a.out
5 3
2 3 4 5 4
3 4 2 3 2
mi = 1
a : 2 3 4 5 3 
b : 3 4 2 3 2 
a : 2 -3 4 5 3 
b : 3 4 2 3 2 
val=23

【问题讨论】:

  • 闻到 UB...检查数组边界...
  • a = (long*)malloc(n*sizeof(long)); b = (long*)malloc(n*sizeof(long)); 移动到scanf("%li %li",&amp;n,&amp;k);之后

标签: c arrays segmentation-fault


【解决方案1】:

你可以再想想这个序列的顺序:

long n , k , i , mi , val , pn , *a , *b , flag ;
a = (long*)malloc(n*sizeof(long));
b = (long*)malloc(n*sizeof(long));
scanf("%li %li",&n,&k);

您使用未初始化的变量n 分配内存,然后请求输入。

你弄乱了数组边界也就不足为奇了……

【讨论】:

  • @user8029928 如果对您有帮助,您应该将答案标记为正确!
  • 是的,我应该等待 7 分钟才能接受它。所以 :)
猜你喜欢
  • 2017-02-27
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2015-08-15
相关资源
最近更新 更多