题目

题目地址:PAT 乙级 1037

题解

本题有两个版本的代码,初版因为种种问题写得比较繁琐,具体的分析见后文,更新的之后的版本相对来说要好很多,代码也比较清晰简洁。

初版的代码主要有如下几方面的问题:

1. 代码繁琐,把简单的问题复杂化。

2. 刷题一直在用C++,虽说C和C++相似,但是思路一直在框定在C++的范围内,不够灵活。

下面就具体代码进行分析:

代码

 #include <iostream>
#include <string>
#include <cmath>
using namespace std; struct Data {
string str;
int g;
int s;
int k;
int Q;
}; int str2int(string s) {
int num = ;
int cnt = ;
for (int i = s.size() - ; i >= ; i--) {
num += (int(s[i]) - ) * pow(, cnt);
cnt++;
}
return num;
} void str2num(Data &s) {
int cnt = , loc = ;
for (int i = ; i < s.str.size(); i++) {
string tmp;
if (s.str[i] == '.' && cnt == ) {
tmp = s.str.substr(, i);
s.g = str2int(tmp);
loc = i;
cnt++;
}
else if (s.str[i] == '.' && cnt == ) {
tmp = s.str.substr(loc + , i - loc - );
s.s = str2int(tmp);
loc = i;
cnt++;
}
else if (i == s.str.size() - ) {
tmp = s.str.substr(loc + , i - loc);
s.k = str2int(tmp);
loc = i;
}
}
} void compare(Data &a, Data &b) {
a.Q = ;
b.Q = ;
if (a.g > b.g)
a.Q += ;
else if (a.g < b.g)
b.Q += ;
if (a.s > b.s)
a.Q += ;
else if (a.s < b.s)
b.Q += ;
if (a.k > b.k)
a.Q++;
else if (a.k < b.k)
b.Q++;
} int main() {
Data P, A;
cin >> P.str >> A.str;
str2num(P);
str2num(A);
compare(P, A);
int g = , s = , k = ;
if (P.Q < A.Q) {
if (A.k >= P.k)
k = A.k - P.k;
else {
A.s--;
A.k += ;
k = A.k - P.k;
}
if (A.s >= P.s)
s = A.s - P.s;
else {
A.g--;
A.s += ;
s = A.s - P.s;
}
g = A.g - P.g;
}
else {
if (P.k >= A.k)
k = P.k - A.k;
else {
P.s--;
P.k += ;
k = P.k - A.k;
}
if (P.s >= A.s)
s = P.s - A.s;
else {
P.g--;
P.s += ;
s = P.s - A.s;
}
g = -(P.g - A.g);
}
cout << g << "." << s << "." << k << endl; return ;
}

1. 在接收输入数据时,使用string接收数据,之后再进行一系列转化,最后才能得到int类型的数据,这个过程就很“笨拙”;因为输入的格式固定,所以如果使用C语言的scanf的格式控制符,就可以极大地简化数据接收部分的代码;

2. 同时在写代码过程中,帮助我理清了一个问题,也是我一直忽视的一个点:结构体在函数内部对数据的操作不能赋给主函数中的实参,现在想来也是很简单的一个问题,函数内部的变量只是局部变量,这句话在学C的时候看到过很多次,当时还不能很清楚地理解;形参传入后仍然只是一个局部变量,函数内开的一切变量作用范围都只在函数中,一旦函数调用结束,当前存在函数变量中的数据都随函数的调用结束一并被清除;

解决方式有几种,一是调用结束后将数据返回,二是采用全局变量,三是以引用的方式传参,这里选择第三种方式有效地解决了这一问题。

更新之后的代码相对而言简洁得多,思路是把所有输入数据全部转化为最小进制的单位,相减之后再化回不同的单位。

代码

 #include <iostream>
#include <cstdio>
using namespace std; int main() {
int g1 = , s1 = , k1 = ;
int g2 = , s2 = , k2 = ;
scanf("%d.%d.%d %d.%d.%d", &g1, &s1, &k1, &g2, &s2, &k2);
long cnt1 = , cnt2 = ;
cnt1 = (g1 * + s1) * + k1;
cnt2 = (g2 * + s2) * + k2;
long tmp = cnt2 - cnt1;
if (tmp < ) {
printf("-");
tmp = -tmp;
}
int g = , s = , k = ;
g = tmp / / ;
s = (tmp - g * * ) / ;
k = tmp - g * * - s * ;
printf("%d.%d.%d\n", g, s, k); return ;
}

PAT 乙级 1037的更多相关文章

  1. PAT乙级1037

    题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232 题解 还算简单,就是模拟我们在生活 ...

  2. PAT 乙级 1037 在霍格沃茨找零钱(20)C++版

    1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知 ...

  3. PAT乙级-1037. 在霍格沃茨找零钱(20)

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...

  4. PAT 乙级 1041

    题目 题目地址:PAT 乙级 1041 题解 这道题学到的东西恰好和1037中学到的东西相互补充,总结如下: 在之前的博文中我曾提到过——“结构体在函数内部对数据的操作不能赋给主函数中的实参,函数内部 ...

  5. C#版 - PAT乙级(Basic Level)真题 之 1021.个位数统计 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - P ...

  6. PAT乙级真题及训练题 1025. 反转链表 (25)

    PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...

  7. PAT 乙级 1024

    题目 题目地址:PAT 乙级 1024 题解 模拟题,重点需要考虑到各种不同情况:简单来说一下: 因为输入格式固定,所以把不同的部分分别存储和处理可以在很大程度上简化运算:其中需要考虑最多的就是小数部 ...

  8. PAT 乙级 1017

    题目 题目地址:PAT 乙级 1017 题解 粗看是一道大数除法题,实际上只不过是通过字符数组模拟除法过程,理解之后还是比较简单的: 具体分析一下本题: 因为题设中的除数(n)是一位整数,因此大幅简化 ...

  9. PAT 乙级 1015

    题目 题目地址:PAT 乙级 1015 题解 常规题,难点在于理清楚排序规则,通过比较简洁的方式进行编码: 在这里我选择使用vector进行存储,并使用sort方法排序,因为本题不是简单按照大小排序, ...

随机推荐

  1. Maven私服搭建(Nexus Repository Manager 3)

    下载和安装 下载地址:https://help.sonatype.com/repomanager3/download 注意:Nexus Repository Manager 3是一个Java服务器应用 ...

  2. struts2学习笔记 day02 获取参数 访问ServletAPI 结果类型

  3. AKOJ-2010-魔法石

    链接:https://oj.ahstu.cc/JudgeOnline/problem.php?id=2010 题意: Vyoung最近收集到一大批魔法石,这些魔法石有两种特性,攻击和防守,不同特性的两 ...

  4. p标签中的文本换行

    参考文章 word-break:break-all和word-wrap:break-word的区别 CSS自动换行.强制不换行.强制断行.超出显示省略号 属性介绍 white-space: 如何处理元 ...

  5. 084 Largest Rectangle in Histogram 柱状图中最大的矩形

    给出 n 个非负整数来表示柱状图的各个柱子的高度,每个柱子紧挨彼此,且宽度为 1 .您的函数要能够求出该柱状图中,能勾勒出来的最大矩形的面积. 详见:https://leetcode.com/prob ...

  6. 牛客网Java刷题知识点之多线程同步的实现方法有哪些

    不多说,直接上干货! 为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),  将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避 ...

  7. 访问NopCommerce的Admin 运行Nop.Admin后台管理

    Step 1.下载和安装NopCommerce的源码: Step 2.打开和运行Presentation下的Nop.Web 项目: Step 3.初次运行 会弹出界面 配置管理员账号 和 数据库信息: ...

  8. 第六章 设计程序架构 之 设计实现WebSocket策略

    1. 概述 传统网页的通信方式是请求-响应模式,每次请求-响应都是新的连接.连接的建立和断开也是需要消耗资源的. WebSocket是基于TCP协议,实现单个连接上的双向通信. 本章内容包括: 异步读 ...

  9. CSS元素隐藏的display和visibility

    一.CSS元素隐藏 在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击. { display: none; /* 不占据空间, ...

  10. Android 实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置

    前几天看到了有人在android5.0上实现了如下图一样的效果,我自己就去搜了下.参考了国外一篇文章和国内的一篇文章,最终实现了想要的效果.具体参考的网址我已经贴到文章末尾,大家可以去英文的那个网站看 ...