PAT_Basic_1062

这是一道大水题,但有需要注意的地方!
虽然简单,但通过率只有0.19,来看看有啥坑!

题目描述:

最简分数(20)
一个分数一般写成两个整数相除的形式:N/M,其中M不为0。最简分数是指分子和分母没有公约数的分数表示形式。

现给定两个不相等的正分数 N1/M1 和 N2/M2,要求你按从小到大的顺序列出它们之间分母为K的最简分数。

输入格式:

输入在一行中按N/M的格式给出两个正分数,随后是一个正整数分母K,其间以空格分隔。题目保证给出的所有整数都不超过1000。

输出格式:

在一行中按N/M的格式列出两个给定分数之间分母为K的所有最简分数,按从小到大的顺序,其间以1个空格分隔。行首尾不得有多余空格。题目保证至少有1个输出。

输入样例:
7/18 13/20 12
输出样例:
5/12 7/12

首先这是我的解法:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#include <stdlib.h>
bool pd1(int n,int m){
    int i;
    for(i=2;i<=n;i++){
        if(n%i==0&&m%i==0){
            return false;
        }
    }
    return true;
}
bool pd2(double a){
    int b=a;
    a-=b;
    if(a>0){
        return false;
    }
    else{
        return true;
    }
}
void swap(double *a1,double *a2){
    double temp=*a1;
    *a1=*a2;
    *a2=temp;
}
int main(){
    int n1,n2,m1,m2,k,i,flag=0;
    scanf("%d/%d %d/%d %d",&n1,&m1,&n2,&m2,&k);
    double r1=(double)n1*k/m1,r2=(double)n2*k/m2;
    if(r1>r2){
        swap(&r1, &r2);
    }
    int start=r1+1,end;
    if(pd2(r2)==true){
        end=r2;
    }
    else{
        end=r2+1;
    }
    for(i=start;i<end;i++){
        if(pd1(i,k)==true&&flag==0){
            printf("%d/%d",i,k);
            flag=1;
        }
        else if(pd1(i,k)==true){
            printf(" %d/%d",i,k);
        }
    }
    return 0;
}

首先是大小问题,并未说第一个数小于第二个数,所以就要判断一下。
再就是右端点的注意,若右端点分子是一个整数,那么不能加1,所以也要判断。

select distinct a.EMPI_ID, a.PATIENT_NO, a.MR_NO, a.PAT_NAME, a.PAT_SEX, a.PAT_AGE, a.PAT_PHONE_NO, b.DIAG_RESULT, a.ADMIT_DATE, a.DISCHARGE_DEPT_NAME, a.ATTEND_DR from BASIC_INFORMATION a join PA_DIAG b on a.MZZY_SERIES_NO=b.MZZY_SERIES_NO join EXAM_DESC_RESULT_CODE c on a.MZZY_SERIES_NO=c.MZZY_SERIES_NO join DRUG_INFO d on a.MZZY_SERIES_NO=d.MZZY_SERIES_NO join EMR_CONTENT e on a.MZZY_SERIES_NO=e.MZZY_SERIES_NO JOIN TEST_INFO A17 ON a.MZZY_SERIES_NO = A17.MZZY_SERIES_NO where a.PAT_AGE>='18' and (to_char(a.ADMIT_DATE,'YYYY-MM-DD') >= '2021-01-01') AND (b.DIAG_RESULT LIKE '%鼻咽癌%' or b.DIAG_RESULT LIKE '%鼻咽恶性肿瘤%' or b.DIAG_CODE LIKE '%C11/900%') and d.DRUG_NAME not in (select DRUG_NAME FROM DRUG_INFO WHERE DRUG_NAME like '卡培他滨') and b.DIAG_RESULT NOT IN (SELECT DIAG_RESULT FROM PA_DIAG WHERE DIAG_RESULT LIKE '%HIV阳性%') and b.DIAG_RESULT NOT IN (SELECT DIAG_RESULT FROM PA_DIAG WHERE DIAG_RESULT LIKE '%充血性心力衰竭%') AND to_char(( A17.TEST_DETAIL_ITEM_NAME = '中性粒细胞' AND A17.TEST_RESULT >= 1.5 ) OR ( A17.TEST_DETAIL_ITEM_NAME = '血小板' AND A17.TEST_RESULT >= 100 ) OR ( A17.TEST_DETAIL_ITEM_NAME = '血红蛋白' AND A17.TEST_RESULT >= 9 ) OR ( A17.TEST_DETAIL_ITEM_NAME = '丙氨酸氨基转移酶' AND A17.TEST_RESULT <= 2.5 ) OR ( A17.TEST_DETAIL_ITEM_NAME = '天门冬氨酸氨基转移酶' AND A17.TEST_RESULT <= 2.5 ) OR ( A17.TEST_DETAIL_ITEM_NAME = '肌酐清除率' AND A17.TEST_RESULT > 51 ) OR ( A17.TEST_DETAIL_ITEM_NAME = '肌酐' AND A17.TEST_RESULT <=1.5 ) OR ( A17.TEST_DETAIL_ITEM_NAME = '凝血酶原时间' AND A17.TEST_RESULT <= 1.5 ))语句哪里有问题
最新发布
06-07
这个 SQL 语句中有一个问题,就是在最后一个 AND 子句中的 to_char() 函数的参数不正确。to_char() 函数需要一个日期或数字类型的参数,但是这里传入的是一个逻辑类型的表达式。 如果你想要在 WHERE 子句中使用逻辑表达式,则可以使用 CASE WHEN 语句来实现。下面是修改后的 SQL 语句: ``` SELECT DISTINCT a.EMPI_ID, a.PATIENT_NO, a.MR_NO, a.PAT_NAME, a.PAT_SEX, a.PAT_AGE, a.PAT_PHONE_NO, b.DIAG_RESULT, a.ADMIT_DATE, a.DISCHARGE_DEPT_NAME, a.ATTEND_DR FROM BASIC_INFORMATION a JOIN PA_DIAG b ON a.MZZY_SERIES_NO = b.MZZY_SERIES_NO JOIN EXAM_DESC_RESULT_CODE c ON a.MZZY_SERIES_NO = c.MZZY_SERIES_NO JOIN DRUG_INFO d ON a.MZZY_SERIES_NO = d.MZZY_SERIES_NO JOIN EMR_CONTENT e ON a.MZZY_SERIES_NO = e.MZZY_SERIES_NO JOIN TEST_INFO A17 ON a.MZZY_SERIES_NO = A17.MZZY_SERIES_NO WHERE a.PAT_AGE >= '18' AND (TO_CHAR(a.ADMIT_DATE, 'YYYY-MM-DD') >= '2021-01-01') AND ( b.DIAG_RESULT LIKE '%鼻咽癌%' OR b.DIAG_RESULT LIKE '%鼻咽恶性肿瘤%' OR b.DIAG_CODE LIKE '%C11/900%' ) AND d.DRUG_NAME NOT IN ( SELECT DRUG_NAME FROM DRUG_INFO WHERE DRUG_NAME LIKE '卡培他滨' ) AND b.DIAG_RESULT NOT IN ( SELECT DIAG_RESULT FROM PA_DIAG WHERE DIAG_RESULT LIKE '%HIV阳性%' ) AND b.DIAG_RESULT NOT IN ( SELECT DIAG_RESULT FROM PA_DIAG WHERE DIAG_RESULT LIKE '%充血性心力衰竭%' ) AND ( CASE WHEN A17.TEST_DETAIL_ITEM_NAME = '中性粒细胞' AND A17.TEST_RESULT >= 1.5 THEN 'Y' WHEN A17.TEST_DETAIL_ITEM_NAME = '血小板' AND A17.TEST_RESULT >= 100 THEN 'Y' WHEN A17.TEST_DETAIL_ITEM_NAME = '血红蛋白' AND A17.TEST_RESULT >= 9 THEN 'Y' WHEN A17.TEST_DETAIL_ITEM_NAME = '丙氨酸氨基转移酶' AND A17.TEST_RESULT <= 2.5 THEN 'Y' WHEN A17.TEST_DETAIL_ITEM_NAME = '天门冬氨酸氨基转移酶' AND A17.TEST_RESULT <= 2.5 THEN 'Y' WHEN A17.TEST_DETAIL_ITEM_NAME = '肌酐清除率' AND A17.TEST_RESULT > 51 THEN 'Y' WHEN A17.TEST_DETAIL_ITEM_NAME = '肌酐' AND A17.TEST_RESULT <= 1.5 THEN 'Y' WHEN A17.TEST_DETAIL_ITEM_NAME = '凝血酶原时间' AND A17.TEST_RESULT <= 1.5 THEN 'Y' ELSE 'N' END) = 'Y'; ``` 在最后一个 AND 子句中,使用了 CASE WHEN 语句来判断测试结果是否符合条件。如果测试结果符合条件,则返回 Y,否则返回 N。然后再判断返回值是否等于 Y。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值