pat a1081

Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum.

Input Specification:

Each input file contains one test case. Each case starts with a positive integer N (≤100), followed in the next line N rational numbers a1/b1 a2/b2 … where all the numerators and denominators are in the range of long int. If there is a negative number, then the sign must appear in front of the numerator.

Output Specification:

For each test case, output the sum in the simplest form integer numerator/denominator where integer is the integer part of the sum, numerator < denominator, and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.

Sample Input 1:

5
2/5 4/15 1/30 -2/60 8/3
Sample Output 1:

3 1/3
Sample Input 2:

2
4/3 2/3
Sample Output 2:

2
Sample Input 3:

3
1/3 -1/6 1/8
Sample Output 3:

7/24

代码

#include<stdio.h>
typedef long long ll;
struct fen
{
    ll zi;
    ll mu;
    ll jia=0;
};
fen huajian(fen a)
{
    if(a.zi>=a.mu)
    {
        a.jia=a.zi/a.mu;
        a.zi=a.zi-a.zi/a.mu*a.mu;
    }
    return a;
}
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
fen jia(fen a,fen b)
{
    fen sum;
    sum.zi=a.zi*b.mu+a.mu*b.zi;
    sum.mu=a.mu*b.mu;
    if(sum.zi!=0)
    {
        ll q=gcd(sum.zi,sum.mu);
        sum.zi=sum.zi/q;
        sum.mu=sum.mu/q;
    }
    return sum;
}
int main()
{
    ll gcd(ll a,ll b);
    fen jia(fen a,fen b);
    fen huajian(fen a);
    int n;
    scanf("%d",&n);
    fen f[n];
    fen sum;
    scanf("%lld/%lld",&sum.zi,&sum.mu);
    for(int i=1;i<n;i++)
    {
        scanf("%lld/%lld",&f[i].zi,&f[i].mu);
        sum=jia(sum,f[i]);
    }
    sum=huajian(sum);
    if(sum.zi!=0)
    {
        ll q=gcd(sum.zi,sum.mu);
        sum.zi=sum.zi/q;
        sum.mu=sum.mu/q;
    }
    if(sum.zi!=0&&sum.jia!=0)
    printf("%lld %lld/%lld",sum.jia,sum.zi,sum.mu);
    else if(sum.zi==0)
        printf("%lld",sum.jia);
    else if(sum.jia==0)
        printf("%lld/%lld",sum.zi,sum.mu);
}
<think>好的,我需要帮助用户找到PAT乙级1081题目的解析或编程答案。首先,用户已经提供了几个参考引用,我需要仔细看看这些引用是否包含相关信息。 引用[1]提到的是PAT甲级题目的变化和分类,可能和乙级的1081题没有直接关系。引用[2]是关于基础编程题集的答案,使用纯C编写,但具体题目是7-1到7-38,可能不包含1081。引用[3]则明确提到了乙级1081题的检查密码问题,并提供了分析、步骤、伪代码和代码,看起来是最相关的。 接下来,我需要确认用户的需求:他们需要1081题的解析或答案。根据引用[3],里面正好有这道题的详细解析和代码示例。因此,应该重点引用这部分内容。同时,用户希望回答结构清晰,分步骤说明问题,并保证正确性。 我需要整理问题分析、解决思路,并给出代码示例。注意用户提到的格式要求,比如行内数学公式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式不多,主要是编程逻辑。还要用中文回答,生成相关问题,并在引用处标注正确的标识符。 然后,根据引用[3],检查密码的条件包括长度、至少包含字母和数字,可能有其他字符但只能是字母、数字和点号。代码需要逐个字符检查,并统计是否符合条件。用户可能需要C语言的示例,但引用[3]中的代码是否用C呢?原文提到的是“从小白开始逐步掌握用编程解决问题”,但不确定代码语言。可能需要确认,但根据引用[3]的描述,可能使用Python或其他语言。但用户提供的引用[2]是纯C的答案,所以这里可能需要提供一个C语言的示例,或者参考引用[3]的伪代码转换为C。 不过,用户的问题是关于PAT乙级1081,而引用[3]直接提到了这个问题,因此应该直接引用其中的内容,包括问题分析、解决步骤和代码。假设引用[3]中的代码是C语言的话,就可以直接使用。否则可能需要调整。 现在需要组织回答结构:问题分析、解决思路、代码实现(使用C语言),并附上相关问题。同时,确保引用标识正确,例如在解析部分末尾添加[^3]。 最后,生成相关问题,可能与密码验证、字符串处理、PAT乙级其他题目相关。</think>### PAT乙级 1081 检查密码 题目解析 #### **问题分析** 题目要求验证密码是否符合以下条件: 1. 长度≥6,否则输出"Your password is tai duan le." 2. 至少包含字母和数字,否则提示缺少类型(如只有数字则输出"Your password needs zi mu.") 3. 若包含非字母/数字/点号的字符,输出"Your password is tai luan le." #### **解决思路** 1. **输入处理**:读取N个密码字符串,逐条验证。 2. **长度检查**:直接判断字符串长度是否≥6。 3. **字符类型检查**: - 遍历每个字符,标记是否包含字母、数字。 - 若遇到非字母/数字/点号的字符,标记为非法。 4. **结果判断**:根据标记输出对应提示。 #### **代码实现(C语言示例)** ```c #include <stdio.h> #include <ctype.h> #include <string.h> int main() { int N; scanf("%d", &N); getchar(); // 吸收换行符 for (int i = 0; i < N; i++) { char password[81]; fgets(password, 81, stdin); password[strcspn(password, "\n")] = '\0'; // 去除末尾换行符 int len = strlen(password); int has_alpha = 0, has_digit = 0, valid = 1; if (len < 6) { printf("Your password is tai duan le.\n"); continue; } for (int j = 0; j < len; j++) { char c = password[j]; if (isalpha(c)) has_alpha = 1; else if (isdigit(c)) has_digit = 1; else if (c != '.') valid = 0; // 非法字符 } if (!valid) { printf("Your password is tai luan le.\n"); } else if (!has_alpha || !has_digit) { if (!has_alpha && !has_digit) printf("Your password needs zi mu and shu zi.\n"); else if (!has_alpha) printf("Your password needs zi mu.\n"); else printf("Your password needs shu zi.\n"); } else { printf("Your password is wan mei.\n"); } } return 0; } ``` [^3] #### **关键点说明** - **字符类型判断**:使用`isalpha()`和`isdigit()`函数区分字母和数字。 - **非法字符处理**:若字符不是字母、数字或点号,则标记为非法。 - **输出逻辑**:按优先级处理不同错误类型(长度→非法字符→缺少类型)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值