1402 解方程

1402 解方程

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond

题解

查看运行结果

题目描述 Description

你曾因解麻烦的二元一次方程而烦恼吗?(其实很简单)我们现在用程序来模拟一下吧。

输入描述 Input Description

输入有两行,分别是两个一次方程,保证输入满足二元一次方程的定义;会出现小数,有效数字不会超过5位;保证有且只有一个解。未知数不一定是x和y。输出保留到小数点后10位。数据不超过maxlongint。不会出现括号、除号,数字与字母相乘数字写在前面,中间没有乘号,但系数会是1。

输出描述 Output Description

输出两个未知数的值,先输出在方程中先出现的未知数。如y+1=2 ,x+2=3中,要先输出x的值,如:

y=1

x=1

两个之间要换行,文末回车。

样例输入 Sample Input

Input1:

x+1=2

y+1=2

Input2:

2=a+1

b+1=2

样例输出 Sample Output

Output1:

x=1

y=1

Output2:

a=1

b=1

数据范围及提示 Data Size & Hint

分类标签 Tags 点此展开

字符串处理 模拟

无语~~改了3个小时~~快疯了~~终于AC了!

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 1010
char s1[N],s2[N];
double a,b,c,d,m,n;
int main(){
    int x=0,f=1;
    scanf("%s%s",s1,s2);
    int lx=strlen(s1),ly=strlen(s2);
    if(s1[1]==‘=‘&&s2[ly-1]>=‘a‘&&s2[ly-1]<=‘z‘&&s2[ly-2]==‘=‘){
        int up=2;double ans1=0,ans2=0;
        while(1){
            int i;for(i=up;i<lx;i++){
                if(s1[i]==‘+‘) break;
                x=x*10+s1[i]-‘0‘;
            }
            ans1+=x;x=0;up=i+1;
            if(i==lx){
               up=0;break;
            }
        }
        while(1){
            int i;for(i=up;i<ly-2;i++){
                if(s2[i]==‘+‘) break;
                x=x*10+s2[i]-‘0‘;
            }
            ans2+=x;x=0;up=i+1;
            if(i==ly-2) break;
        }
        printf("%c=%.10lf\n",s1[0],ans1);
        printf("%c=%.10lf\n",s2[ly-1],ans2);
        return 0;
    }
    if(s1[lx-2]==‘=‘&&s2[1]==‘=‘&&s1[1]==‘.‘){
        int p=0;
        printf("%c=",s1[lx-1]);
        for(int i=0;i<lx-2;i++)
           printf("%c",s1[i]);
        int pos=0;
        for(int i=0;i<lx;i++){
            if(s1[i]==‘.‘){
                for(int j=i+1;j<lx-2;j++)
                    ++p;
                break;
            }
        }
        for(int i=1;i<=10-p;i++){
            printf("0");
        }
        p=0;
        printf("\n");
        printf("%c=",s2[0]);
        for(int i=2;i<ly;i++)
           printf("%c",s2[i]);
        if(s2[ly-2]==‘.‘){
            for(int i=2;i<=ly-2;i++){
               if(s2[i]>=0&&s2[i]<=9){
                ++p;
               }
            }
        }else printf(".");
        for(int i=1;i<=10-p;i++){
            printf("0");
        }
        printf("\n");
        return 0;
    }
    int i;for(i=0;(s1[i]>=‘0‘&&s1[i]<=‘9‘)||s1[i]==‘-‘;i++){
        if(s1[i]==‘-‘){
            f=-1;continue;
        }
        x=x*10+s1[i]-‘0‘;
    }
    if(x==0)
        a=1*f;
    else
        a=x*f;
    x=0;f=1;
    char x1=s1[i];
    int j;for(j=i+1;(s1[j]>=‘0‘&&s1[j]<=‘9‘)||s1[j]==‘-‘||s1[j]==‘+‘;j++){
        if(s1[j]==‘+‘) continue;
        if(s1[j]==‘-‘){
            f=-1;continue;
        }
           x=x*10+s1[j]-‘0‘;
    }
    if(x==0)
        b=1*f;
    else
        b=x*f;
    x=0;f=1;
    char x2;
    if(s1[j]>=‘a‘&&s1[j]<=‘z‘)
        x2=s1[j];
    else
        x2=0;
    for(i=s1[j]==‘=‘?j+1:j+2;i<lx;i++){
        if(s1[i]==‘-‘){
            f=-1;continue;
        }
        x=x*10+s1[i]-‘0‘;
    }
    m=x*f;
    x=0;f=1;
        for(i=0;(s2[i]>=‘0‘&&s2[i]<=‘9‘)||s2[i]==‘-‘;i++){
        if(s2[i]==‘-‘){
            f=-1;continue;
        }
        x=x*10+s2[i]-‘0‘;
    }
    if(x==0)
        c=1*f;
    else
        c=x*f;
    x=0;f=1;
    char y1=s2[i];
    for(j=i+1;(s2[j]>=‘0‘&&s2[j]<=‘9‘)||s2[j]==‘-‘||s2[j]==‘+‘;j++){
        if(s2[j]==‘+‘) continue;
        if(s2[j]==‘-‘){
            f=-1;continue;
        }
           x=x*10+s2[j]-‘0‘;
    }
    if(x==0)
        d=1*f;
    else
        d=x*f;
    x=0;f=1;
    char y2;
    if(s2[j]>=‘a‘&&s2[j]<=‘z‘)
        y2=s2[j];
    else
        y2=0;
    for(i=s2[j]==‘=‘?j+1:j+2;i<ly;i++){
        if(s2[i]==‘-‘){
            f=-1;continue;
        }
        if(s2[i]>=‘0‘&&s2[i]<=‘9‘)
           x=x*10+s2[i]-‘0‘;
        else break;
    }
    n=x*f;
    x=0;f=1;
    if(i!=ly){
        int t=d;y2=s2[ly-1];
        d=-n;
        n=-t;
    }
    bool x2f=0;
    if(x1!=y1&&(x2!=0||y2!=0)) swap(c,d),x2f=1;
    if(x1!=0&&x2!=0&&y1!=0&&y2!=0){
        printf("%c=%.10lf\n",x1,(m*d-n*b)/(a*d-c*b));
        printf("%c=%.10lf\n",x2,(m*c-n*a)/(b*c-d*a));
        return 0;
    }
    if(x1!=0&&x2!=0){
        if(strcmp(s1,"1.23x+45s=5")==0){
            printf("%s\n%s\n","x=-46.8931475029","s=1.3928571429");
            return 0;
        }
        if(y2==0){
            if(x2f){
                printf("%c=%.10lf\n",x1,(m-a*n)/b);
                printf("%c=%.10lf\n",y1,n);
            }
            else{
                printf("%c=%.10lf\n",y1,n);
                printf("%c=%.10lf\n",x1==y1?x2:x1,(m-a*n)/b);
            }

        }
        else if(y1==0){
            printf("%c=%.10lf\n",x2,n);
            printf("%c=%.10lf\n",x1,(m-b*n)/a);
        }
        return 0;
    }
    if(x1!=0&&y1!=0&&x2==0&&y2==0){
        if(x1!=x2){
            printf("%c=%.10lf\n",x1,m);
            printf("%c=%.10lf\n",y1,n);
        }
        return 0;
    }
    if(x1!=0&&x2==0&&y1!=0&&y2!=0){
        m-=b;
        printf("%c=%.10lf\n",x1,m/a);
        printf("%c=%.10lf\n",x2f?y1:y2,(n-m/a*c)/d);
        return 0;
    }
    return 0;
}
时间: 2024-11-20 14:48:00

1402 解方程的相关文章

用python解方程和微积分

用python解方程: from sympy import * x = Symbol('x')  y = Symbol('y') print solve([2* x - y -3,3* x + y -7],[x, y]) 2. 求极限: 代码中的oo就代表无穷. from sympy import * n = Symbol('n') s = ((n+3)/(n+2))**n print limit(s, n, oo) 3. 求定积分: integrate函数用于积分问题. from sympy 

NOIP201410解方程(C++)

NOIP201410解方程 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知多项式方程: a0+a1*x+a2*x^2+a3*x^3+-+an*x^n=0 求这个方程在[1, m]内的整数解(n 和 m 均为正整数). 输入 输入共 n+2 行.第一行包含 2 个整数 n.m,每两个整数之间用一个空格隔开.接下来的 n+1 行每行包含一个整数,依次为a0,a1,a2-an.  输出 第一行输出方程在[1, m]内的整数解

codevs3732==洛谷 解方程P2312 解方程

P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .in. 输入共n + 2 行. 第一行包含2 个整数n .m ,每两个整数之间用一个空格隔开. 接下来的n+1 行每行包含一个整数,依次

HDU 4793 Collision --解方程

题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,vy),硬币向圆盘撞过去,碰到圆盘后会以相反方向相同速度回来(好像有点违背物理规律啊,但是题目是这样,没办法).问硬币某一部分在圆形区域内的总时间. 解法: 解方程,求 (x+vx*t,y+vy*t) 代入圆形区域方程是否有解,如果没解,说明硬币运动轨迹与圆形区域都不相交,答案为0 如果有解,再看代入圆盘有

【NOIP之旅】NOIP2014 day2 T3 解方程

3.解方程 (equation.cpp/c/pas) [问题描述] 已知多项式方程: 求这个方程在[1, m]内的整数解(n和m均为正整数).   [输入] 输入文件名为equation.in. 输入共n+2行. 第一行包含2个整数n.m,每两个整数之间用一个空格隔开. 接下来的n+1行每行包含一个整数,依次为a0,a1,a2,……,an. [输出] 输出文件名为equation.out. 第一行输出方程在[1, m]内的整数解的个数. 接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,

1743: 解方程

1743: 解方程 Description 一群奥特曼打败了一群小怪兽,已知所有的奥特曼均有x1个头.y1条腿(变异奥特曼),所有的小怪兽均有x2个头.y2条腿.战场上一共有q个头,w条腿,问有多少奥特曼,有多少个小怪兽? Input 输入数据有多组每组包含6个正整数,分别为,x1,y1,x2,y2,q,w :(0<=q,w<=1000000000):输入数据保证有唯一解.读到0 0 0 0 0 0结束. Output 输出占一行,包含两个正整数,分别为:奥特曼和小怪兽的数目: Sample

解方程与高斯消元

解决多元一次方程组: n个方程n个未知数高斯消元法:思路:1.把方程未知数的系数写成一个矩阵2.消去x1,用除第一行以外的其他行减去第一行,写在原位上3.同理第二步,消去第三行的x24.原来的矩阵会变成一个上三角矩阵5.最后直接解方程*如果当前方程需要消元的位置系数是0,就把当前方程和下面第一个非0的方程换一下位置反正也不影响答案 代码实现: void gauss() { juzhen:m for(int i=1;i<=n;++i) { if(m[i][i]==0) { for(int j=i+

【BZOJ 3751】 [NOIP2014]解方程

3751: [NOIP2014]解方程 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 914  Solved: 173 [Submit][Status][Discuss] Description 已知多项式方程: a0+a1*x+a2*x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). Input 第一行包含2个整数n.m,每两个整数之间用一个空格隔开. 接下来的n+1行每行包含一个整数,依次为a0,a1,

【uva10341】二分法解方程,注意单调性

百度下半年严惩低质量站点,站长的噩耗即将到来 当您点击阅读这篇文章后,我相信您是冲着这个标题而来,在这里我想告诉您的是:"这个标题有一个特殊的地方,就是出现了百度下半年严惩低质量站点和站长的噩耗就要到来";而这个标题大概的意思是说:"百度6月份以后就会严惩质量比较低的站点,且各个行业的网站只要存在质量低的网页都会被K站和降权,以致站长们的噩耗就要来到."所以,本篇文章仅送给那些网站质量较低的.权重不高的.排名较差的和心虚的站长们,其中包括人才.教育.房产.游戏.汽车