题目

题目地址: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 ;
}

最新文章

  1. bean生命周期
  2. 快速了解SPA单页面应用
  3. django 的模板语言
  4. XMPP框架下微信项目总结(3)获取点子名片信息(个人资料)更新电子名片
  5. 查看Linux分区格式
  6. wpf中手风琴控件Accordion编辑模板后控件不正常。
  7. Mac下安装Wireshark,双击闪退
  8. auto,register,static分析
  9. LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt
  10. Linux Shell常用命令手册(Updating)
  11. spring+springMVC+JPA配置详解(使用缓存框架ehcache)
  12. 李洪强iOS开发之-环信02.1_环信 SDK 2.x到3.0升级文档
  13. sh_脚本语法
  14. TCP/IP网络协议栈(转载)
  15. a标签点击之后有个虚线边框,怎么去掉
  16. QT 延时函数设置
  17. Spring框架——IOC依赖注入
  18. 【vue】vue全家桶
  19. 2018.7.3 lnmp一键安装包无人值守版本 php7.2 + nginx1.14.0 + mariadb5.5 + centos7.1(1503) 环境搭建 + Thinkphp5.1.7 配置
  20. BTree和B+Tree详解

热门文章

  1. IT兄弟连 JavaWeb教程 JSP访问JavaBean
  2. hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3)
  3. Java反编译工具JD-GUI以及Eclipse的反编译插件
  4. Linux —— 压缩命令
  5. nodejs学习(3) express+socket.io
  6. 17997 Simple Counting 数学
  7. webstock学习
  8. Oracle/MySql/SQL Sqlserver分页查询
  9. LINQ to Entities不支持Convert.ToDateTime方法解決一例
  10. pay-spring-boot 开箱即用的Java支付模块,整合支付宝支付、微信支付