gpt4 book ai didi

c - 数组的最后一个元素将自身更改为另一个数组的第一个元素

转载 作者:行者123 更新时间:2023-11-30 14:56:24 28 4
gpt4 key购买 nike

所以问题陈述是编写一段代码来找到两个数组的最小乘积和,即将同一索引中的值相乘然后将它们相加。第一个数组中的元素最多可以更改 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

最佳答案

你可能会再次考虑一下这个序列的顺序:

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来分配内存,然后要求输入。

你弄乱数组边界并不奇怪......

关于c - 数组的最后一个元素将自身更改为另一个数组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44714214/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com