パート2基本的なアルゴリズム
第1章高精度計算
1307高精度乗算
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void init(int a[]) {
string s;
cin >> s;
a[0] = s.size();
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = s[a[0]-i] - '0';
}
}
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a * 高精度 b = 高精度 c
void mul2(int a[], int b[], int c[]) {
for (int i = 1; i <= a[0]; i ++ ) {
int t = 0;
for (int j = 1; j <= b[0]; j ++ ) {
t += c[i+j-1] + a[i]*b[j];
c[i+j-1] = t % 10;
t /= 10;
}
if (t) c[i+b[0]] = t;
}
c[0] = a[0] + b[0];
while(!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
init(a);
init(b);
mul2(a, b, c);
dy(c);
return 0;
}
1308高精度
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void init(int a[]) {
string s;
cin >> s;
a[0] = s.size();
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = s[a[0]-i] - '0';
}
}
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a - 高精度 b = 高精度 c
void sub(int a[], int b[], int c[]) {
int t = 0;
c[0] = a[0];
for (int i = 1; i <= c[0]; i ++ ) {
t = a[i] - b[i] - t;
c[i] = (t + 10) % 10;
t = t < 0 ? 1 : 0;
}
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
//如果高精度 a > 高精度 b,返回 1
//如果高精度 a < 高精度 b,返回 -1
//如果高精度 a = 高精度 b,返回 0
int cmp(int a[], int b[]) {
while (!a[a[0]] && a[0] > 1) a[0] -- ;
while (!b[b[0]] && b[0] > 1) b[0] -- ;
if (a[0] > b[0]) return 1;
if (a[0] < b[0]) return -1;
for (int i = a[0]; i >= 1; i -- ) {
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0;
}
//高精度 a * 低精度 x = 高精度 c
void mul(int a[], int x, int c[]) {
int t = 0;
c[0] = a[0];
for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] * x;
c[i] = t % 10;
t /= 10;
}
while (t) c[++c[0]] = t % 10, t /= 10;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
//高精度 a / 低精度 x = 高精度 c,余数为 r
void div(int a[], int x, int c[], int &r) {
r = 0;
c[0] = a[0];
for (int i = c[0]; i >= 1; i -- ) {
r = r * 10 + a[i];
c[i] = r / x;
r %= x;
}
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
//高精度 a / 高精度 b = 高精度 c,余数为 r
void div2(int a[], int b[], int c[]) {
c[0] = max(a[0] - b[0] + 1, 1);
while(b[0] < a[0]) mul(b, 10, b);
for (int i = c[0]; i >= 1; i -- ) {
while (cmp(a,b) != -1) {
c[i] ++ ;
sub(a, b, a);
}
int r;
div(b, 10, b, r);
}
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
init(a);
init(b);
div2(a, b, c);
dy(c);
dy(a);
return 0;
}
1309回文
#include <iostream>
using namespace std;
const int N = 1e5;
int a[N], c[N], n, cnt = 0;
string m;
void add() {
int t = 0;
for (int i = 1, j = a[0]; i <= a[0]; i ++, j -- ) {
t = t + a[i] + a[j];
c[i] = t % n;
t /= n;
}
if (t) c[++a[0]] = t;
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = c[i];
}
}
bool isPalindromic() {
for (int i = 1, j = a[0]; i < j; i ++, j -- ) {
if (a[i] != a[j]) return false;
}
return true;
}
int main() {
cin >> n >> m;
a[0] = m.size();
for (int i = m.size(); i >= 1; i -- ) {
char ch = m[a[0] - i];
if (ch >= 'A') a[i] = ch - 'A' + 10;
else a[i] = ch - '0';
}
bool res = isPalindromic();
while (!res && cnt <= 30) {
add();
cnt ++ ;
res = isPalindromic();
}
if (cnt <= 30) cout << cnt;
else cout << "Impossible";
return 0;
}
1168大整数加算
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void init(int a[]) {
string s;
cin >> s;
a[0] = s.size();
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = s[a[0]-i] - '0';
}
}
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a + 高精度 b = 高精度 c
void add(int a[], int b[], int c[]) {
int t = 0;
c[0] = max(a[0], b[0]);
for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] + b[i];
c[i] = t % 10;
t /= 10;
}
if (t) c[++c[0]] = t;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
init(a);
init(b);
add(a, b, c);
dy(c);
return 0;
}
1169大整数減算
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void init(int a[]) {
string s;
cin >> s;
a[0] = s.size();
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = s[a[0]-i] - '0';
}
}
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a - 高精度 b = 高精度 c
void sub(int a[], int b[], int c[]) {
int t = 0;
c[0] = a[0];
for (int i = 1; i <= c[0]; i ++ ) {
t = a[i] - b[i] - t;
c[i] = (t + 10) % 10;
t = t < 0 ? 1 : 0;
}
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
init(a);
init(b);
sub(a, b, c);
dy(c);
return 0;
}
11702のn乗を計算します
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a * 低精度 x = 高精度 c
void mul(int a[], int x, int c[]) {
int t = 0;
c[0] = a[0];
for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] * x;
c[i] = t % 10;
t /= 10;
}
while (t) c[++c[0]] = t % 10, t /= 10;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
a[0] = 1, a[1] = 1;
int n;
cin >> n;
while (n--) {
mul(a, 2, a);
}
dy(a);
return 0;
}
1171の大きな整数の因数
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void init(int a[]) {
string s;
cin >> s;
a[0] = s.size();
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = s[a[0]-i] - '0';
}
}
//高精度 a / 低精度 x = 高精度 c,余数为 r
void div(int a[], int x, int c[], int &r) {
r = 0;
c[0] = a[0];
for (int i = c[0]; i >= 1; i -- ) {
r = r * 10 + a[i];
c[i] = r / x;
r %= x;
}
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
init(a);
int r;
bool flag = true;
for (int i = 2; i <= 9; i ++ ) {
div(a, i, c, r);
if (!r) {
cout << i << ' ';
flag = false;
}
}
if (flag) cout << "none";
return 0;
}
117210000内のnの階乗を見つける
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a * 低精度 x = 高精度 c
void mul(int a[], int x, int c[]) {
int t = 0;
c[0] = a[0];
for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] * x;
c[i] = t % 10;
t /= 10;
}
while (t) c[++c[0]] = t % 10, t /= 10;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
a[0] = 1, a[1] = 1;
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) {
mul(a, i, a);
}
dy(a);
return 0;
}
1173階乗和
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a + 高精度 b = 高精度 c
void add(int a[], int b[], int c[]) {
int t = 0;
c[0] = max(a[0], b[0]);
for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] + b[i];
c[i] = t % 10;
t /= 10;
}
if (t) c[++c[0]] = t;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
//高精度 a * 低精度 x = 高精度 c
void mul(int a[], int x, int c[]) {
int t = 0;
c[0] = a[0];
for (int i = 1; i <= c[0]; i ++ ) {
t += a[i] * x;
c[i] = t % 10;
t /= 10;
}
while (t) c[++c[0]] = t % 10, t /= 10;
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
a[0] = 1, a[1] = 1;
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) {
mul(a, i, a);
add(c, a, c);
}
dy(c);
return 0;
}
1175を13で割ったもの
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N], x;
void init(int a[]) {
string s;
cin >> s;
a[0] = s.size();
for (int i = 1; i <= a[0]; i ++ ) {
a[i] = s[a[0]-i] - '0';
}
}
void dy(int a[]) {
for (int i = a[0]; i >= 1; i --) {
cout << a[i];
}
cout << endl;
}
//高精度 a / 低精度 x = 高精度 c,余数为 r
void div(int a[], int x, int c[], int &r) {
r = 0;
c[0] = a[0];
for (int i = c[0]; i >= 1; i -- ) {
r = r * 10 + a[i];
c[i] = r / x;
r %= x;
}
while (!c[c[0]] && c[0] > 1) c[0] -- ;
}
int main() {
init(a);
int r;
div(a, 13, c, r);
dy(c);
cout << r;
return 0;
}
お子さんが4年生以上で、コンピュータープログラミングに興味があり、文化の授業に余裕がある場合は、カスタマーサービス(WeChat ID:xiaolan7321)に連絡して情報学の学習に参加してください。私たちはプロの情報学コンテストのコーチであり、オンラインの少人数クラスの教授法を使用しています。目標は、プログラミングを愛する小中学生が国内外の情報学コンテストで優れた結果を達成できるよう支援することです。
教育機能:
-
オンラインの少人数クラスの教育は、優れたコード基盤を築きます。大規模なクラスで「ついていけない」または「食べるのに十分でない」という問題を避けてください。
-
豊富な教育経験、学生の知識構造と学習能力に精通し、スケジュールを合理的に調整します。
-
競技会で練習し、試験や競技会を通じて学生の能力を継続的に向上させます。