解题思路:
方程组:
n1*a[1]+n2*b[1]+n3*c[1]=n4*d[1]
n1*a[2]+n2*b[2]+n3*c[2]=n4*d[2]
n1*a[3]+n2*b[3]+n3*c[3]=n4*d[3]
只把n1,n2,n3当作未知量,
解得n1=n4*(c[3]*b[2]*d[1]-c[2]*b[3]*d[1]-b[1]*c[3]*d[2]+b[1]*c[2]*d[3]-b[2]*c[1]*d[3]+b[3]*c[1]*d[2])/(a[1]*b[2]*c[3]-a[1]*b[3]*c[2]+a[3]*b[1]*c[2]-a[2]*b[1]*c[3]-a[3]*b[2]*c[1]+a[2]*b[3]*c[1])。这个其实并不难算,动一动手,不到10分钟就能算出来。
再根据轮换性将a改为b,b改为c,c改为a,就得到n2的解
a改为c,b改为a,c改为b,就得到n3的解
将n4从1到10000遍历,每次循环算出n1,n2,n3,再验证是否是整除(最简单的方法就是乘分子是否等于n4*分母)
over!
注意事项:
这种写法实际有缺陷,对于分母分子都为0的情况无法解决
比如:2 2 2
2 2 2
2 2 2
2 2 2
不过这种情况概率太小了,数据集一般都给的是很大的奇奇怪怪的数字。
参考代码:
#include
using namespace std;
typedef long long ll;
ll d[4],a[4],b[4],c[4];
ll n4,n1,n2,n3;
ll k1,k2,k3,k4,k5,k6;//六个解方程的结果的常数
bool check(){
n1=n4*k1/k2;
if((n1*k2)!=(n4*k1))return false;
n2=n4*k3/k4;
if((n2*k4)!=(n4*k3))return false;
n3=n4*k5/k6;
if((n3*k6)!=(n4*k5))return false;
if(n1<0||n2<0||n3<0)return false;
return true;
}
int main(){
for(int i=1;i<=3;i++)scanf("%lld",&d[i]);
for(int i=1;i<=3;i++)scanf("%lld",&a[i]);
for(int i=1;i<=3;i++)scanf("%lld",&b[i]);
for(int i=1;i<=3;i++)scanf("%lld",&c[i]);
k1=c[3]*b[2]*d[1]-c[2]*b[3]*d[1]-b[1]*c[3]*d[2]+b[1]*c[2]*d[3]-b[2]*c[1]*d[3]+b[3]*c[1]*d[2];
k2=a[1]*b[2]*c[3]-a[1]*b[3]*c[2]+a[3]*b[1]*c[2]-a[2]*b[1]*c[3]-a[3]*b[2]*c[1]+a[2]*b[3]*c[1];
k3=a[3]*c[2]*d[1]-a[2]*c[3]*d[1]-c[1]*a[3]*d[2]+c[1]*a[2]*d[3]-c[2]*a[1]*d[3]+c[3]*a[1]*d[2];
k4=b[1]*c[2]*a[3]-b[1]*c[3]*a[2]+b[3]*c[1]*a[2]-b[2]*c[1]*a[3]-b[3]*c[2]*a[1]+b[2]*c[3]*a[1];
k5=b[3]*a[2]*d[1]-b[2]*a[3]*d[1]-a[1]*b[3]*d[2]+a[1]*b[2]*d[3]-a[2]*b[1]*d[3]+a[3]*b[1]*d[2];
k6=c[1]*a[2]*b[3]-c[1]*a[3]*b[2]+c[3]*a[1]*b[2]-c[2]*a[1]*b[3]-c[3]*a[2]*b[1]+c[2]*a[3]*b[1];
bool flag=0;
for(n4=1;n4<=10000;n4++){
if(check()){
flag=1;
break;
}
}
if(flag)printf("%lld %lld %lld %lld",n1,n2,n3,n4);
else printf("NONE");
system("pause");
return 0;
}
0.0分
1 人评分
母牛的故事 (C语言代码)浏览:478 |
【亲和数】 (C语言代码)浏览:908 |
成绩转换 (C语言代码)浏览:1048 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:628 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:561 |
字符串输入输出函数 (C语言代码)浏览:2604 |
简单的a+b (C语言代码)浏览:1024 |
蓝桥杯历届试题-翻硬币 (C++代码)浏览:953 |
C二级辅导-公约公倍 (C语言代码)浏览:537 |
判定字符位置 (C语言代码)浏览:849 |