174 条题解
-
1
声明:后几种方法一般不用
C++题解
这里采用多种方法求解。
方法一
读入a和b,输出a+b。
#include <bits/stdc++.h> using namespace std; int a, b; int main() { scanf("%d%d", &a, &b); printf("%d\n", a + b); return 0; }
如果你看不懂上面的代码,那你可以看看下面的。
#include <bits/stdc++.h> using namespace std; #define 开始啦 main() #define 开头 { #define 结尾 } #define 和 , #define 没了 return 0 #define 整数32位 int #define 输入 cin #define 输出 cout #define 一个 >> #define 这个 << #define 加上 + #define 换行 '\n' 整数32位 开始啦 开头 整数32位 a 和 b; 输入 一个 a 一个 b; 输出 这个 a 加上 b 这个 换行; 没了; 结尾
方法二
数手指都会吧,我们就用“数手指”的方法做这一题。
#include <bits/stdc++.h> using namespace std; int a, b, ans = 0; int main() { scanf("%d%d", &a, &b); for (int i = 1; i <= a; i++) ans++; for (int j = 1; j <= b; j++) ans++; printf("%d\n", ans); return 0; }
方法三
用算法数据结构的角度来思考一下这一题……
我们可以设计一个这样的算法:先将a和b插入到一个数据结构(栈、队列或堆)中,非空时,将头上的元素取出,如果大于1则拆成它减1和1(根据自己的喜好)再插入,否则统计答案。
栈写法
#include <bits/stdc++.h> using namespace std; int a, b, ans = 0; stack<int> s; int main() { scanf("%d%d", &a, &b); s.push(a); s.push(b); while (!s.empty()) { int x = s.top(); s.pop(); if (x > 1) { s.push(x - 1); s.push(1); } else ans += x; } printf("%d\n", ans); return 0; }
队列写法
#include <bits/stdc++.h> using namespace std; int a, b, ans = 0; queue<int> q; int main() { scanf("%d%d", &a, &b); q.push(a); q.push(b); while (!q.empty()) { int x = q.front(); q.pop(); if (x > 1) { q.push(x - 1); q.push(1); } else ans += x; } printf("%d\n", ans); return 0; }
堆写法
#include <bits/stdc++.h> using namespace std; int a, b, ans = 0; priority_queue<int> h; int main() { scanf("%d%d", &a, &b); h.push(a); h.push(b); while (!h.empty()) { int x = h.top(); h.pop(); if (x > 1) { h.push(x - 1); h.push(1); } else ans += x; } printf("%d\n", ans); return 0; }
方法四
我们可以使用高精度加法。
#include <bits/stdc++.h> using namespace std; char s1[100], s2[100]; int a[100], b[100], c[100]; int main() { scanf("%s%s", s1 + 1, s2 + 1); int la = strlen(s1 + 1), lb = strlen(s2 + 1), lc; lc = max(la, lb); for (int i = 1; i <= la; i++) a[i] = s1[la - i + 1] - '0'; for (int i = 1; i <= lb; i++) b[i] = s2[lb - i + 1] - '0'; memset(c, 0, sizeof(c)); for (int i = 1; i <= lc; i++) { c[i] += a[i] + b[i]; c[i + 1] = c[i] / 10; c[i] %= 10; } if (c[lc + 1] > 0) lc++; for (int i = lc; i >= 1; i--) printf("%d", c[i]); printf("\n"); return 0; }
方法五
将方法三和方法四结合。
#include <bits/stdc++.h> using namespace std; int a, b, c[100], lc = 1; priority_queue<int> h; int main() { scanf("%d%d", &a, &b); h.push(a); h.push(b); memset(c, 0, sizeof(c)); while (!h.empty()) { int x = h.top(); h.pop(); if (x > 1) { h.push(x - 1); h.push(1); } else { c[1] += x; for (int i = 1; i <= lc; i++) { c[i + 1] += c[i] / 10; c[i] %= 10; } if (c[lc + 1] > 0) lc++; } } for (int i = lc; i >= 1; i--) printf("%d", c[i]); printf("\n"); return 0; }
你竟然认真的看完了!
恭喜你,把简单的问题复杂化了!要是你真的看懂了,就说明你
太没事闲的了!
信息
- ID
- 56
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 1
- 标签
- 递交数
- 10234
- 已通过
- 4616
- 上传者