洛谷【P1553 数字反转(升级版)】题解

客官°小女子只卖身不卖艺 2022-10-29 11:25 307阅读 0赞

题目背景

以下为原题面,仅供参考

给定一个数,请将该数各个位上数字反转得到一个新数。

这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。

题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。

这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。

整数反转是将所有数位对调。

小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。

分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。

百分数的分子一定是整数,百分数只改变数字部分。

输入格式
一个数 s

输出格式
一个数,即 s 的反转数

输入输出样例

输入 #1

  1. 5087462

输出 #1

  1. 2647805

输入 #2

  1. 600.084

输出 #2

  1. 6.48

输入 #3

  1. 700/27

输出 #3

  1. 7/72

输入 #4

  1. 8670%

输出 #4

  1. 768%

说明/提示

所有数据:25%s是整数,不大于20位

25%s是小数,整数部分和小数部分均不大于10位

25%s是分数,分子和分母均不大于10位

25%s是百分数,分子不大于19位

(20个数据)

数据保证:

  • 对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。
  • 对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 00(小数部分除了 00 没有别的数,那么只保留 11 个 00。若反转之后末尾数字出现 00,请省略多余的 00)
  • 对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为0。与整数翻转相关规定见上。
  • 对于百分数翻转而言,见与整数翻转相关内容。

数据不存在负数。


我的解题方法很笨重但是很易懂,慢慢看很容易。把整数、小数、分数、百分数分成4个函数。

  1. #include <iostream>
  2. #include <string>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. void fraction(string str);
  8. void percent(string str);
  9. void decimal(string str);
  10. void integer(string str);
  11. int main()
  12. {
  13. string str;
  14. cin >> str;
  15. if (str.find(".") != string::npos)
  16. {
  17. decimal(str);
  18. }
  19. else if (str.find("%") != string::npos)
  20. {
  21. percent(str);
  22. }
  23. else if (str.find("/") != string::npos)
  24. {
  25. fraction(str);
  26. }
  27. else
  28. {
  29. integer(str);
  30. }
  31. return 0;
  32. }
  33. void decimal(string str)
  34. {
  35. string s1, s2;
  36. s1 = str.substr(0, str.find("."));
  37. s2 = str.substr(str.find(".") + 1, str.size() - 1);
  38. // cout << s1 << " " << s2 << endl; // 测试
  39. reverse(s1.begin(), s1.end());
  40. reverse(s2.begin(), s2.end());
  41. int i1, i2, e2;
  42. string ans1 = "", ans2 = "";
  43. int st;
  44. for (int i = 0; i < s1.size(); i++)
  45. {
  46. if (s1[i] == '0')
  47. continue;
  48. else
  49. {
  50. st = i;
  51. break;
  52. }
  53. }
  54. for (int i1 = st; i1 < s1.size(); i1++)
  55. {
  56. ans1 += s1[i1];
  57. }
  58. for (int i2 = s2.size() - 1; i2 >= 0; i2--)
  59. {
  60. if (s2[i2] == '0')
  61. continue;
  62. else
  63. {
  64. e2 = i2;
  65. break;
  66. }
  67. }
  68. // cout << e2 << endl;
  69. for (int i = 0; i < e2 + 1; i++)
  70. {
  71. ans2 += s2[i];
  72. }
  73. // 补零
  74. if (ans2.size() == 0)
  75. ans2 = "0";
  76. cout << ans1 << "." << ans2 << endl;
  77. }
  78. void integer(string str)
  79. {
  80. reverse(str.begin(), str.end());
  81. string ans = "";
  82. int st;
  83. for (int i = 0; i < str.size(); i++)
  84. {
  85. if (str[i] == '0')
  86. continue;
  87. else
  88. {
  89. st = i;
  90. break;
  91. }
  92. }
  93. // cout << st << endl;
  94. for (int i = st; i < str.size(); i++)
  95. {
  96. ans += str[i];
  97. }
  98. cout << ans;
  99. }
  100. void percent(string s)
  101. {
  102. string str = s.substr(0, s.size() - 1);
  103. // cout << str << endl; // 测试
  104. integer(str);
  105. cout << "%" << endl;
  106. return;
  107. }
  108. void fraction(string str)
  109. {
  110. string s1, s2;
  111. s1 = str.substr(0, str.find("/"));
  112. s2 = str.substr(str.find("/") + 1, str.size() - 1);
  113. // cout << s1 << " " << s2 << endl; // 测试
  114. reverse(s1.begin(), s1.end());
  115. // reverse(s2.begin(), s2.end());
  116. int i1, i2, e2;
  117. string ans1 = "", ans2 = "";
  118. int st;
  119. for (int i = 0; i < s1.size(); i++)
  120. {
  121. if (s1[i] == '0')
  122. continue;
  123. else
  124. {
  125. st = i;
  126. break;
  127. }
  128. }
  129. for (int i1 = st; i1 < s1.size(); i1++)
  130. {
  131. ans1 += s1[i1];
  132. }
  133. // for (int i2 = s2.size() - 1; i2 >= 0; i2--)
  134. // {
  135. // if (s2[i2] == '0')
  136. // continue;
  137. // else
  138. // {
  139. // e2 = i2;
  140. // break;
  141. // }
  142. // }
  143. // // cout << e2 << endl;
  144. // for (int i = 0; i < e2 + 1; i++)
  145. // {
  146. // ans2 += s2[i];
  147. // }
  148. cout << ans1 << "/";
  149. // 补零
  150. // if (ans2.size() == 0)
  151. // ans2 = "0";
  152. integer(s2);
  153. return;
  154. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读