怎么用C语言解多元一次方程?需要得到最合适的解。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用C语言解多元一次方程?需要得到最合适的解。相关的知识,希望对你有一定的参考价值。
如:1000a+500b+300c+200d+100e+50f+10g=1980
求a,b,c,d,e,f,g的最合适的解(要求能用大的未知数的倍数就用大的)
即此时a=1,b=1,c=1,d=0,e=1,f=1,g=3为最合适的解。
(1000*1+500*1+300*1+200*0+100*1+50*1+10*3=1980)
有几个变量就需要几个方程。
解线性方程组的方法很多,例如高斯消去法。
“最合适的解” -- 什么叫最合适,要用一个一个方程描述/写出来。
方程个数少于变量个数时得无穷个解。 参考技术A 很简单你只需写一个自定义规则来判断不就行了吗?追问
就是不知道如何判断
本回答被提问者采纳方程的解
总之这题如果静下心来仔细想,拿个80分并不难
问题:扩欧只会板子,并未理解,扩欧解出来的是一组解而已,并没有最值等的特殊性。
ax+by=c必须在c能整除gcd(a,b)的情况下,此时会有n多组解,设d=gcd(a,b);x=(c/d)*x0+k*(b/d),y=(c/d)*x0-k*(a/d);
这题还是值得好好看看,因为特判情况可以搞到许多分。包括数据范围的特判,解的个数的特判。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #define xian 65535 6 #define ll long long 7 using namespace std; 8 inline ll read() 9 ll s=0,w=1;char ch=getchar(); 10 while(ch<‘0‘||ch>‘9‘)if(ch==‘-‘)w=-1;ch=getchar(); 11 while(ch>=‘0‘&&ch<=‘9‘)s=s*10+ch-‘0‘,ch=getchar(); 12 return s*w; 13 14 15 ll T; 16 ll a,b,c; 17 ll ltmp; 18 ll exgcd(ll a,ll b,ll &x,ll &y) 19 if(!b) 20 x=1;y=0; 21 return a; 22 23 ll lgcd=exgcd(b,a%b,x,y); 24 ltmp=x; 25 x=y; 26 y=ltmp-a/b*y; 27 return lgcd; 28 29 30 int main() 31 // freopen("da.in","r",stdin); 32 // freopen("te.out","w",stdout); 33 T=read(); 34 while(T) 35 --T; 36 a=read();b=read();c=read(); 37 //cout<<c<<endl; 38 39 if(a==0&&b==0) 40 if(!c)puts("ZenMeZheMeDuo");continue; 41 elseputs("0");continue; 42 43 if(!a) 44 if(c*b<0)puts("0");continue; 45 else 46 if(!c)puts("0");continue; 47 if(c%b)puts("0");continue; 48 elseputs("ZenMeZheMeDuo");continue; 49 50 51 if(!b) 52 if(c*a<0)puts("0");continue; 53 else 54 if(!c)puts("0");continue; 55 if(c%a)puts("0");continue; 56 elseputs("ZenMeZheMeDuo");continue; 57 58 59 60 if(a+b==c)puts("1");continue; 61 if(a<0)a*=-1,b*=-1,c*=-1; 62 if(b>0&&c<0)puts("0");continue; 63 if(b>0&&c>0) 64 if(a==1&&b==1) 65 if(c-1>xian)puts("ZenMeZheMeDuo"); 66 else printf("%lld\n",(c-1)); 67 continue; 68 69 70 71 ll x,y; 72 ll lin=exgcd(a,b,x,y); 73 74 if(c%lin)puts("0");continue; 75 if(a*b<0)puts("ZenMeZheMeDuo");continue; 76 77 ll xi=c/lin; 78 x*=xi;y*=xi; 79 80 if(x==0&&y==0)puts("0");continue; 81 if(x<0&&y<0)puts("0");continue; 82 83 ll jx=b/lin,jy=a/lin; 84 ll ans=0; 85 86 if(x<=0)ans=ceil(y*1.0/jy)-1-(-1*x/jx); 87 else if(y>=0)ans=ceil(x*1.0/jx)-1-(-1*y/jy); 88 else ans=ceil(x*1.0/jx)-1+ceil(1.0*y/jy); 89 90 if(ans<=0)puts("0");continue; 91 if(ans>xian)puts("ZenMeZheMeDuo");continue; 92 93 printf("%lld\n",ans); 94 95 return 0; 96
以上是关于怎么用C语言解多元一次方程?需要得到最合适的解。的主要内容,如果未能解决你的问题,请参考以下文章