题目B1022 D进制的A+B
-
题意
将十进制A+B的结果转换为D进制的数输出。 -
思路
这里看A,B
的范围知道int
类型即可。然后在进制转换的时候需要倒着输出最后的结果,所以我这里算是偷懒用string
类型存储最后的结果并且每求出一位采用头插法插入字符串。
注意点
:需要判断A+B
为0的情况。
- Code in C++
#include <iostream>
#include <string>
std::string tr2D(int num, int D)
{
std::string result = "";
if (num == 0) {
result = "0";
}
while (num) {
result.insert(0, 1, '0' + num % D);
num = num / D;
}
return result;
}
int main()
{
int A, B, D;
std::cin >> A >> B >> D;
std::cout << tr2D(A+B,D) << std::endl;
return 0;
}
题目B1037 在霍格沃茨找零钱
-
题意
按兑换规则计算两数之差。 -
思路
- 我这里实现就是直接按最直接的思路两数相减,从最低位开始然后不够借位来实现的。我这里需要注意当结果为负数的时候需要处理一下。
- 另外一种思路是都把钱兑换为最基础的
Knut
然后进行计算,同样负数处理要转换为绝对值。然后输出公式为:x/(17*29).x%(17*29)/29.x%29
。这个公式想不过来可以用十进制的数举个例子。
注意点
:负数结果的处理。
- Code in C++
#include <iostream>
struct holy{
long long Galleon;
short Sickle;
short Knut;
} input[2];
// 判断钱是否为0
bool isZero(holy &num) {
if (num.Galleon == 0 && num.Sickle == 0 && num.Knut == 0) {
return true;
} else {
return false;
}
}
// lhs - rhs
holy sub(holy &lhs, holy &rhs) {
if (isZero(rhs)) {
return lhs;
}
if (isZero(lhs)) {
lhs.Galleon = - rhs.Galleon;
lhs.Sickle = - rhs.Sickle;
lhs.Knut = - rhs.Knut;
return lhs;
}
holy result;
// Knut
if (lhs.Knut >= rhs.Knut) {
result.Knut = lhs.Knut - rhs.Knut;
} else {
result.Knut = lhs.Knut - rhs.Knut + 29;
lhs.Sickle -= 1;
}
if (lhs.Sickle >= rhs.Sickle) {
result.Sickle = lhs.Sickle - rhs.Sickle;
} else {
result.Sickle = lhs.Sickle - rhs.Sickle + 17;
lhs.Galleon -= 1;
}
result.Galleon = lhs.Galleon - rhs.Galleon;
// 负数处理
if (result.Galleon < 0) {
if (result.Knut != 0) {
result.Knut = 29 - result.Knut;
result.Sickle += 1;
}
if (result.Sickle != 0) {
result.Sickle = 17 - result.Sickle;
result.Galleon += 1;
}
}
return result;
}
int main()
{
char c;
for (int i = 0; i < 2; ++i) {
std::cin >> input[i].Galleon >> c >> input[i].Sickle >> c >> input[i].Knut;
}
holy result = sub(input[1], input[0]);
std::cout << result.Galleon << c << result.Sickle << c << result.Knut << std::endl;
return 0;
}
题目A1011 D进制的A+B
-
题意
计算转换进制后的结果是不是回文数字。单个数字是回文数字。 -
思路
这里就是简单的先转换进制,然后再判断是不是回文。只不过这里根据题目的数字范围,只能使用数组存储转换之后的结果。
注意点
:string
基础char
类型最大表示为127
,所以不能使用string
类型。
- Code in C++
#include <iostream>
bool isPalindromic(int z[], int num) {
for (int i = 0; i <= num / 2; ++i) {
if (z[i] != z[num - 1 - i]) {
return false;
}
}
return true;
}
int main()
{
int n, b, z[40], num = 0;
scanf("%d%d", &n, &b);
do {
z[num++] = n % b;
n /= b;
} while (n != 0);
bool flag = isPalindromic(z, num);
if (flag == true) printf("Yes\n");
else printf("No\n");
for (int i = num - 1; i >= 0; i--) {
printf("%d", z[i]);
if (i != 0) printf(" ");
}
return 0;
}
小结
- 每次写函数的时候,需要先写对特殊情况的判断然后再写接下来的逻辑。
- 一些思路在特定情况下可行但是换一个情况就不可行了。(比如这里对于进制的求法是否可以使用
string
类型存储结果(最大数字表示127
))
PS:
庆幸自己从一而终的使用string
类型来做转换发现它对数存储大小的限制问题,给自己了一个警醒。