洛谷题单算法1-1模拟与高精度

这篇具有很好参考价值的文章主要介绍了洛谷题单算法1-1模拟与高精度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

发文章只是为了督促自己做题,双非大二刚转科班的菜菜一枚,代码仅供参考,不足之处望理解。

P2670 [NOIP2015 普及组] 扫雷游戏

#include<iostream>
using namespace std;
int n, m, i = 0, j = 0;
char ch[105][105] = { 0 };
int dilei(int i, int j, int n, int m) {
	int cnt = 0, flag = 0;
	if (ch[i][j] == '*'){
		flag = 1;
	}
	else {
		if (ch[i - 1][j - 1] == '*')
			cnt++;
		if (ch[i - 1][j] == '*')
			cnt++;
		if (ch[i - 1][j + 1] == '*')
			cnt++;
		if (ch[i][j - 1] == '*')
			cnt++;
		if (ch[i][j + 1] == '*')
			cnt++;
		if (ch[i + 1][j - 1] == '*')
			cnt++;
		if (ch[i + 1][j] == '*')
			cnt++;
		if (ch[i + 1][j + 1] == '*')
			cnt++;
	}
	if (flag == 0)
		return cnt;
	else
		return -1;
}
int main() {
	cin >> n >> m;
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= m; j++) {
			cin >> ch[i][j];
		}
	}
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= m; j++) {
			if (dilei(i, j, n, m) >= 0)
				cout << dilei(i, j, n, m);
			else
				cout << "*";
		}
		cout << endl;
	}
	return 0;
}

P1042 [NOIP2003 普及组] 乒乓球

#include<iostream>
#include<math.h>
using namespace std;
char ch[2501][25] = { '0' };
int i = 0, j = 0;
void eleven(char ch[2501][25]) {
	int cntw = 0, cntl = 0;
	for (i = 0; i < 2501; i++) {
		for (j = 0; j < 25; j++) {
			if (ch[i][j] == 'W')
				cntw++;
			else if (ch[i][j] == 'L')
				cntl++;
			else
				goto flag1;
			if ((cntw >= 11 || cntl >= 11)) {
				if (abs(cntw - cntl) < 2) {
					continue;
				}
				else {
				cout << cntw << ":" << cntl << endl;
					cntw = 0, cntl = 0;
				}
			}
		}
	}
flag1:
	cout << cntw << ":" << cntl << endl;
}
void twentyone(char ch[2501][25]) {
	int cntw = 0, cntl = 0;
	for (i = 0; i < 2501; i++) {
		for (j = 0; j < 25; j++) {
			if (ch[i][j] == 'W')
				cntw++;
			else if (ch[i][j] == 'L')
				cntl++;
			else
				goto flag1;
			if ((cntw >= 21 || cntl >= 21)) {
				if (abs(cntw - cntl) < 2) {
					continue;
				}
				else {
				cout << cntw << ":" << cntl << endl;
					cntw = 0, cntl = 0;
				}
			}
		}
	}
flag1:
	cout << cntw << ":" << cntl << endl;
}
int main() {
	for (i = 0; i < 2501; i++) {
		for (j = 0; j < 25; j++) {
			flag1:
			cin>>ch[i][j];
			while (ch[i][j] == 'E')
				goto flag2;
		}
	}
flag2:
	eleven(ch);
	cout << endl;
	twentyone(ch);
	return 0;
}

P1563 [NOIP2016 提高组] 玩具谜题

#include<iostream>
using namespace std;
struct toy {
	int dir;
	string name;
};
struct act {
	int a, s;
};
toy to[100005];
act ac[100005];
int n, m, i = 0, j = 0, k = 0;
int main() {
	cin >> n >> m;
	for (i = 0; i < n; i++)
		cin >> to[i].dir >> to[i].name;
	for (i = 0; i < m; i++) {
		cin >> ac[i].a >> ac[i].s;
		if (to[k].dir == 0 && ac[i].a == 0)
			k = (k + (n - ac[i].s)) % n;
		else if (to[k].dir == 0 && ac[i].a == 1)
			k = (k + ac[i].s) % n;
		else if (to[k].dir == 1 && ac[i].a == 0)
			k = (k + ac[i].s) % n;
		else if (to[k].dir == 1 && ac[i].a == 1)
			k = (k + (n - ac[i].s)) % n;
	}
	cout << to[k].name;
	return 0;
}

P1601 A+B Problem(高精)

#include<iostream>
#include<vector>
using namespace std;
string A, B;
vector<int>a, b, c;
vector<int>add(vector<int>& a, vector<int>& b) {
	int t = 0;
	for (int i = 0; i < a.size() || i < b.size(); i++) {
		if (i < a.size())
			t += a[i];
		if (i < b.size())
			t += b[i];
		c.push_back(t % 10);
		t /= 10;
	}
	if (t)
		c.push_back(1);
	return c;
}
int main() {
	cin >> A >> B;
	for (int i = A.size() - 1; i >= 0; i--)
		a.push_back(A[i] - '0');
	for (int i = B.size() - 1; i >= 0; i--)
		b.push_back(B[i] - '0');
	auto c = add(a, b);
	for (int i = c.size() - 1; i >= 0; i--)
		cout << c[i];
	return 0;
}

P1303 A*B Problem

#include<iostream>
#include<vector>
using namespace std;
string A, B;
vector<int>a, b;
vector<int>mul(vector<int>& a, vector<int>& b) {
	vector<int>c(a.size() + b.size() + 5, 0);
	for (int i = 0; i < a.size(); i++)
		for (int j = 0; j < b.size(); j++)
			c[i + j] += a[i] * b[j];
	int t = 0;
	for (int i = 0; i < c.size(); i++) {
		t += c[i];
		c[i] = t % 10;
		t /= 10;
	}
	while (c.size() > 1 && c.back() == 0)
		c.pop_back();
	return c;
}
int main() {
	cin >> A >> B;
	for (int i = A.size() - 1; i >= 0; i--)
		a.push_back(A[i] - '0');
	for (int i = B.size() - 1; i >= 0; i--)
		b.push_back(B[i] - '0');
	auto c = mul(a, b);
	for (int i = c.size() - 1; i >= 0; i--)
		cout << c[i];
	return 0;
}

P1009 [NOIP1998 普及组] 阶乘之和

#include<iostream>
using namespace std;
const int value = 1e5;
void jiecheng(int* a, int n) {
	a[0] = 1;
	for (int k = 1; k < value; k++)
		a[k] = 0;
	int i, j;
	for (i = 2; i <= n; i++) {
		int jw = 0;
		for (j = 0; j < value; j++) {
			int s = a[j] * i + jw;
			jw = s / 10;
			a[j] = s % 10;
		}
	}
}
int sum[value];
void qiuhe(int* a) {
	int jw = 0;
	for (int i = 0; i < value; i++) {
		sum[i] = sum[i] + a[i] + jw;
		jw = sum[i] / 10;
		sum[i] %= 10;
	}
}
int main() {
	int n, m;	cin >> n;
	int a[value] = { 0 };
	for (int i = 1; i <= n; i++) {
		jiecheng(a, i);
		qiuhe(a);
	}
	int i;
	for (i = value - 1; i >= 0; i--) {
		if (sum[i] == 0)
			continue;
		break;
	}
	for (i; i >= 0; i--)
		cout << sum[i];
	return 0;
}

P4924 [1007] 魔法少女小Scarlet

#include<iostream>
using namespace std;
int n, m, k, q = 1;
int a[505][505] = { 0 };
int f[505] = { 0 }, s[505] = { 0 }, t[505] = { 0 }, v[505] = { 0 };
struct act{
	int x, y, r, z;
}act[505];
void play(int x, int y, int r, int z) {
	int x1 = x - r, y1 = y - r;
	int xx = x - r, yy = y - r,k = 2 * r;
	for (int i = 1; i <= k; i++, yy++)
		f[i] = a[xx][yy];
	xx = x1, yy = y1;
	for (int i = 1; i <= k; i++, xx++)
		s[i] = a[xx][yy + k];
	xx = x1, yy = y1;
	for (int i = 1; i <= k; i++, yy--)
		t[i] = a[xx + k][yy + k];
	xx = x1, yy = y1;
	for (int i = 1; i <= k; i++, xx--)
		v[i] = a[xx + k][yy];
	xx = x1, yy = y1;
	if (z == 0) {
		for (int i = 1; i <= k; i++) {
			int temp = f[i];
			f[i] = v[i];
			v[i] = t[i];
			t[i] = s[i];
			s[i] = temp;
		}
	}
	else {
		for (int i = 1; i <= k; i++) {
			int temp = f[i];
			f[i] = s[i];
			s[i] = t[i];
			t[i] = v[i];
			v[i] = temp;
		}
	}
	for (int i = 1; i <= k; i++, yy++)
		a[xx][yy] = f[i];
	xx = x1, yy = y1;
	for (int i = 1; i <= k; i++, xx++)
		a[xx][yy + k] = s[i];
	xx = x1, yy = y1;
	for (int i = 1; i <= k; i++, yy--)
		a[xx + k][yy + k] = t[i];
	xx = x1, yy = y1;
	for (int i = 1; i <= k; i++, xx--)
		a[xx + k][yy] = v[i];
	xx = x1, yy = y1;
	r--;
	if (r > 0)
		play(x, y, r, z);
}
int main(){
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			a[i][j] = q;
			q++;
		}
	}
	for (int i = 1; i <= m; i++) {
		cin >> act[i].x >> act[i].y >> act[i].r >> act[i].z;
		play(act[i].x, act[i].y, act[i].r, act[i].z);
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

#include<iostream>
using namespace std;
int n, na, nb, cnta = 0, cntb = 0;
int a[205] = { 0 }, b[205] = { 0 };
int caiquan[5][5] = {   {0,2,1,1,2},
		       {1,0,2,1,2},
		       {2,1,0,2,1},
		       {2,2,1,0,1},
		       {1,1,2,2,0}
};
int main(){
	cin >> n >> na >> nb;
	for (int i = 0; i < na; i++)
		cin >> a[i];
	for (int i = na; i < n; i++)
		a[i] = a[i - na];
	for (int i = 0; i < nb; i++)
		cin >> b[i];
	for (int i = nb; i < n; i++)
		b[i] = b[i - nb];
	for (int i = 0; i < n; i++) {
		int x = a[i];
		int y = b[i];
		if (x == y)
			continue;
		if (caiquan[x][y] == 1)
			cnta++;
		if (caiquan[x][y] == 2)
			cntb++;
	}
	cout << cnta << " " << cntb;
	return 0;
}

P1067 [NOIP2009 普及组] 多项式输出

#include<iostream>
using namespace std;
int n, i = 0;
int a[105];
void fuhaomax(int a) {
	if (a == 1)
		return;
	else if (a == -1)
		cout << "-";
	else
		cout << a;
}
void fuhao1(int a) {
	if (a == 1)
		cout << "+";
	else if (a == -1)
		cout << "-";
	else if (a > 0)
		cout << "+" << a;
	else
		cout << a;
}
void fuhao0(int a) {
	if (a > 0)
		cout << "+" << a;
	else
		cout << a;
}
int main(){
	cin >> n;
	for (i = 0; i <= n; i++)
		cin >> a[i];
	if (n == 0) {
		cout << a[0];
		goto key1;
	}
	for (i = 0; i <= n; i++) {
		if (a[i] != 0) {
			if (n - i == n) {
				fuhaomax(a[i]);
				cout << "x^" << n;
			}
			else if (n - i == 1) {
				fuhao1(a[i]);
				cout << "x";
			}
			else if (n - i == 0) {
				fuhao0(a[i]);
			}
			else {
				fuhao1(a[i]);
				cout << "x^" << n - i;
			}
		}
	}
key1:
	return 0;
}

P1098 [NOIP2007 提高组] 字符串的展开

        这题太恶心了,看完题解发现三种情况没有考虑,后来给补上了,我的 if-else 思路可能写的不太好,但是能过

#include<iostream>
#include<cstring>
using namespace std;
int p1, p2, p3, i = 0, j = 0, len = 0;
char in[101];
char out[10000];
char shuzi[10] = { '0','1','2','3','4','5','6','7','8','9' };
char xiaoxie(char ch) {
	if (ch >= 'A' && ch <= 'Z')
		return ch + 32;
	else
		return ch;
}
char daxie(char ch) {
	if (ch >= 'a' && ch <= 'z')
		return ch - 32;
	else
		return ch;
}
int IsShuzi(char ch) {
	for (int p = 0; p < 10; p++) {
		if (ch == shuzi[p]) {
			return 1;
			break;
		}
	}
	return 0;
}
int main() {
	cin >> p1 >> p2 >> p3;
	cin >> in;
	len = strlen(in);
	int flag = 0;
	while (flag == 0 && in[i] == '-') {
		out[j] = in[i];
		i++;
		j++;
	}
	flag = 1;
	for (i; i < len; i++) {
		if (in[i] != '-') {
			out[j] = in[i];
			j++;
		}
		else {
			if (in[i + 1] == '-') {
				while (in[i] == '-') {
					out[j] = in[i];
					j++;
					i++;
				}
				out[j] = in[i];
				j++;
			}
			else {
				if (in[i + 1] == in[i - 1] + 1) {
					out[j] = in[i + 1];
					i++;
					j++;
				}
				else if (in[i - 1] >= in[i + 1]) {
					out[j] = in[i];
					j++;
				}
				else if (in[i - 1] < in[i + 1]) {
					if (IsShuzi(in[i - 1]) == 1 && IsShuzi(in[i + 1]) == 0) {
						out[j] = in[i];
						j++;
					}
					else {
						int x = in[i + 1] - in[i - 1];
						if (p1 == 1) {
							if (p3 == 1) {
								int t = in[i - 1] + 1;
								char min = t;
								char max = t + x - 1;
								for (char ch = xiaoxie(min); ch < xiaoxie(max); ch += 1) {
									for (int r = 0; r < p2; r++) {
										out[j] = ch;
										j++;
									}
								}
							}
							else {
								int t = in[i - 1] + 1;
								char min = t;
								char max = t + x - 2;
								for (char ch = xiaoxie(max); ch >= xiaoxie(min); ch -= 1) {
									for (int r = 0; r < p2; r++) {
										out[j] = ch;
										j++;
									}
								}
							}
						}
						else if (p1 == 2) {
							if (p3 == 1) {
								int t = in[i - 1] + 1;
								char min = t;
								char max = t + x - 1;
								for (char ch = daxie(min); ch < daxie(max); ch += 1) {
									for (int r = 0; r < p2; r++) {
										out[j] = ch;
										j++;
									}
								}
							}
							else {
								int t = in[i - 1] + 1;
								char min = t;
								char max = t + x - 2;
								for (char ch = daxie(max); ch >= daxie(min); ch -= 1) {
									for (int r = 0; r < p2; r++) {
										out[j] = ch;
										j++;
									}
								}
							}
						}
						else if (p1 == 3) {
							for (int r = 0; r < (x - 1) * p2; r++) {
								out[j] = '*';
								j++;
							}
						}
					}
				}
			}
		}
	}
	cout << out << endl;
	return 0;
}

P1591 阶乘数码

#include<iostream>
using namespace std;
int t, n, x;
int a[100000];
int ans[11];
void jiecheng(int* a, int n, int x) {
	a[0] = 1;
	for (int k = 1; k < 100000; k++)
		a[k] = 0;
	int i, j;
	for (i = 2; i <= n; i++) {
		int jw = 0;
		for (j = 0; j < 100000; j++) {
			int s = a[j] * i + jw;
			jw = s / 10;
			a[j] = s % 10;
		}
	}
	int cnt = 0, flag = 0;
	for (int i = 99999; i >= 0; i--) {
		if (a[i] != 0)
			flag = 1;
		if (flag)
			if (a[i] == x)
				cnt++;
	}
	static int k = 0;
	ans[k] = cnt;  k++;
}
int main() {
	cin >> t;
	int flag = 0;
	for (int i = 0; i < t; i++) {
		cin >> n >> x;
		jiecheng(a, n, x);
	}
	for (int i = 0; i < t; i++)
		cout << ans[i] << endl;
	return 0;
}

P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two

        注意结构体在函数中的传参(下学期c语言II要好好跟着大一补):

                point farmer;

                void fun(point *p){      p->     }

                int main () {   fun(&farmer);   }

#include<iostream>
using namespace std;
char ch[12][12];
int i = 0, j = 0;
struct point {
	int x, y, dir;
};
point farmer, cow;
void movefun(point* p) {
	switch (p->dir % 4) {
		case 0:
			if (ch[p->x - 1][p->y] == '*')
				p->dir++;
			else {
				ch[p->x - 1][p->y] = ch[p->x][p->y];
				ch[p->x][p->y] = '.';
				p->x--;
			}
			break;
		case 1:
			if (ch[p->x][p->y + 1] == '*')
				p->dir++;
			else {
				ch[p->x][p->y + 1] = ch[p->x][p->y];
				ch[p->x][p->y] = '.';
				p->y++;
			}
			break;
		case 2:
			if (ch[p->x + 1][p->y] == '*')
				p->dir++;
			else {
				ch[p->x + 1][p->y] = ch[p->x][p->y];
				ch[p->x][p->y] = '.';
				p->x++;
			}
			break;
		case 3:
			if (ch[p->x][p->y - 1] == '*')
				p->dir++;
			else {
				ch[p->x][p->y - 1] = ch[p->x][p->y];
				ch[p->x][p->y] = '.';
				p->y--;
			}
			break;
	}
}
int main(){
	for (i = 0; i <= 11; i++)
		ch[0][i] = '*', ch[11][i] = '*';
	for (i = 1; i <= 10; i++)
		ch[i][0] = '*', ch[i][11] = '*';
	for (int i = 1; i <= 10; i++) {
		for (int j = 1; j <= 10; j++) {
			cin >> ch[i][j];
			if (ch[i][j] == 'F')
				farmer.x = i, farmer.y = j, farmer.dir = 0;
			if (ch[i][j] == 'C')
				cow.x = i, cow.y = j, cow.dir = 0;
		}
	}
	int time = 0, flag = 0;
	while (time <= 1000) {
		movefun(&farmer);
		movefun(&cow);
		time++;
		if (farmer.x == cow.x && farmer.y == cow.y) {
			flag = 1;
			break;
		}
	}
	if (flag == 1)
		cout << time;
	else
		cout << flag;
	return 0;
}

P1065 [NOIP2006 提高组] 作业调度方案

        这题看完题解后还没能理解......

#include<iostream>
using namespace std;
int m, n, ans = 0;
struct Information {
    int id, cost;
} informa[21][21];
int queue[501];int machine_time[21][100001];int step[21];int last_time[21];
int main(){
    cin >> m >> n;
    for (int i = 1; i <= m * n; i++)
        cin >> queue[i];
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> informa[i][j].id;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> informa[i][j].cost;
    for (int i = 1; i <= m * n; i++) {
        int now = queue[i];
        step[now]++;
        int id = informa[now][step[now]].id;
int cost = informa[now][step[now]].cost;
        int s = 0;
        for (int j = last_time[now] + 1; ; j++) {
            if (machine_time[id][j] == 0)
                s++;
            else
                s = 0;
            if (s == cost) {
                for (int k = j - cost + 1; k <= j; k++)
                    machine_time[id][k] = 1;
                if (j > ans)
                    ans = j;
                last_time[now] = j;
                break;
            }
        }
    }
    cout << ans;
    return 0;
}

P1786 帮贡排序

#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct person {
    string name, lastposition, nowposition;
    long long money;
    int grade, num;
}p[111];
int change(string s) {
    if (s == "BangZhu") return 0;
    if (s == "FuBangZhu") return 1;
    if (s == "HuFa") return 2;
    if (s == "ZhangLao") return 3;
    if (s == "TangZhu") return 4;
    if (s == "JingYing") return 5;
    if (s == "BangZhong") return 6;
}
bool cmp(person p1, person p2) {
    if (p1.money == p2.money)
        return p1.num < p2.num;
    else
        return p1.money > p2.money;
}
bool cmpp(person p1, person p2) {
    if (change(p1.nowposition) == change(p2.nowposition)) {
        if (p1.grade == p2.grade)
            return p1.num < p2.num;
        else
            return p1.grade > p2.grade;
    }
    else
        return change(p1.nowposition) < change(p2.nowposition);
}
int main(){
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> p[i].name >> p[i].lastposition >> p[i].money >> p[i].grade;
        p[i].num = i;
    }
    sort(p + 3, p + n, cmp);
    for (int i = 0; i < n; i++) {
        if (i == 0) p[i].nowposition = "BangZhu";
        else if (i == 1 || i == 2) p[i].nowposition = "FuBangZhu";
        else if (i == 3 || i == 4) p[i].nowposition= "HuFa";
        else if (i >= 5 && i <= 8) p[i].nowposition = "ZhangLao";
        else if (i >= 9 && i <= 15) p[i].nowposition = "TangZhu";
        else if (i >= 16 && i <= 40) p[i].nowposition = "JingYing";
        else p[i].nowposition = "BangZhong";
    }
    sort(p, p + n, cmpp);
    for (int i = 0; i < n; i++)
        cout << p[i].name << " " << p[i].nowposition << " " << p[i].grade << endl;
    return 0;
}

P1249 最大乘积

        这题有数学基础,思路会快,理解不了,记住就好:

                正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大:

                        1.先找最小k使 (sum=)2+3+4+...+k >= n

                        2.分类讨论: 1.相等时: 2 3 4 ... k 即为所求

                                            2.sum=n+1时: 3 4 5 ... k k+1 即为所求

                                            3.sum=n+x(x>1)时: 2 3 ... x-1 x+1 ... k 即为所求

#include<iostream>
using namespace std;
int n, s = 0, flag = 0;
int sum[100000];
void jiecheng(int* a, int n) {
    a[0] = 1;
    for (int k = 1; k < 100000; k++)
        a[k] = 0;
    int i, j;
    for (i = 2; i <= n; i++) {
        int jw = 0;
        for (j = 0; j < 100000; j++) {
            int s = a[j] * i + jw;
            jw = s / 10;
            a[j] = s % 10;
        }
    }
}
void chufa(int* a, int n) {
    int r = 0;
    for (int i = 100000 - 1; i >= 0; i--) {
        r = r * 10 + a[i];
        a[i] = r / n;
        r %= n;
    }
}
int main(){
    cin >> n;
    for (int i = 2; i < 200; i++) {
        s += i;
        int x = s - n;
        if (x >= 0) {
            flag = i;
            if (x == 0) {
                for (int i = 2; i <= flag; i++)
                    cout << i << " ";
                jiecheng(sum, i);
            }
            else if (x == 1) {
                for (int i = 3; i < flag; i++)
                    cout << i << " ";
                cout << i + 1;
                x = 2 * i;
                jiecheng(sum, i + 1);
                chufa(sum, x);
            }
            else {
                for (int i = 2; i < x; i++)
                    cout << i << " ";
                for (int i = x + 1; i <= flag; i++)
                    cout << i << " ";
                jiecheng(sum, i);
                chufa(sum, x);
            }
            break;
        }
    }
    cout << endl;
    int i;
    for (i = 100000 - 1; i >= 0; i--) {
        if (sum[i] == 0)
            continue;
        break;
    }
    for (i; i >= 0; i--)
        cout << sum[i];
    return 0;
}

P1045 [NOIP2003 普及组] 麦森数

        这题第一问是数学问题: (2^p)+1的位数 == (2^p)的位数 == (p*lg2)+1的位数

        注意第二问一个一个的×2,会超时(得70points)文章来源地址https://www.toymoban.com/news/detail-826620.html

#include<iostream>
#include<math.h>
using namespace std;
int p, flag = 0;
int a[500] = { 1 };
void chengfa(int* a, int cnt, int x) {
    for (int i = 0; i < cnt; i++) {
        int jw = 0;
        for (int j = 0; j < 500; j++) {
            int s = a[j] * x + jw;
            jw = s / 10;
            a[j] = s % 10;
        }
    }
}
int main(){
    cin >> p;
    cout << (int)(p * log10(2)) + 1 << endl;
    if (p > 10000) {
        int t = pow(2, 20);
        int m = p / 20;
        int n = p - 20 * m;
        chengfa(a, m, t);
        chengfa(a, n, 2);
    }
    else {
        chengfa(a, p, 2);
    }
    a[0] --;
    for (int i = 500 - 1; i >= 0; i--) {
        cout << a[i];
        flag++;
        if (flag % 50 == 0)
            cout << endl;
    }
    return 0;
}

到了这里,关于洛谷题单算法1-1模拟与高精度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++基础算法高精度篇

    📟作者主页:慢热的陕西人 🌴专栏链接:C++算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要讲解了高精度算法的四种常用的计算 以下数字均指位数 ①A + B(精度均在10^6) ②A - B (精度均在10^6) ③A * b (len(A) = 10^6, a = 1000); ④A / b (len(A) = 10^6, a = 1000); Ⅲ. Ⅰ . A

    2024年02月16日
    浏览(36)
  • C++基础算法①——高精度加减法计算

    当我们利用计算机进行数值计算,有时候会遇到这样的问题: n!的精确结果是多少? 当n小于30的时候,我们当然可以通过电脑自带的计算器计算出来。但是当我们遇到 100! 的时候就没有办法直接计算出精确的结果。再比如,求两个20000位的数的和。 那怎么解决精度缺失的问

    2024年02月16日
    浏览(51)
  • 洛谷题单 -- 图论的简单入门

    图的存储 - 洛谷 这一题要考察图的存储方式 , 一般可以使用邻接矩阵 或 邻接表来存储 图的结点 和1 边的信息 ,详情请看代码 :  【深基18.例3】查找文献 - 洛谷 这题考察有向图的 dfs 和 bfs ,详情请看代码,如果用邻接矩阵的话一定会mle,只能够使用邻接表,我这里采用的是用

    2024年04月13日
    浏览(45)
  • 洛谷题单 Part 6.7.1 矩阵

    应队友要求,开始学线性代数,具体路线是矩阵 → rightarrow → 高斯消元 → rightarrow → 线性基。为多项式做个准备 题面 板子,用结构体写的,感觉有点丑,一会儿看看题解有没有写得好看的 题面 搞个方阵 A 3 = [ a 3 a 2 a 1 0 0 0 0 0 0 ] , X = [ 1 1 0 0 0 1 1 0 0 ] , A_3=left [ begin{ma

    2024年02月15日
    浏览(48)
  • 洛谷题单 Part 8.2 最短路问题

    最短路算法一般在算法竞赛中有四种比较常见, F l o y d Floyd Fl oy d 算法, B e l l m a n − F o r d Bellman-Ford B e ll man − F or d 算法, D i j k s t r a Dijkstra D ijk s t r a 算法, S P F A SPFA SPF A 算法。 F l o y d Floyd Fl oy d 算法和 B e l l m a n − F o r d Bellman-Ford B e ll man − F or d 算法的时间复杂

    2024年02月09日
    浏览(53)
  • 算法笔记——高精度算法(附源码)

    📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段, 因为最近参加新星计划算法赛道(白佬),所以加快了脚步,果然急迫感会增加动力 ——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 📖作者主页:热爱编程的

    2023年04月08日
    浏览(74)
  • 高精度算法笔记·····························

    加法 减法 乘法 除法 高精度加法的步骤: 1.高精度数字利用字符串读入 2.把字符串 翻转 存入两个整型数组A、B 3.从低位到高位,逐位求和,进位,存余 4.把数组C从高位到低位依次输出         1.2为准备         3为加法具体实现(0按位取反为-1,即-1时结束等价于=0)  

    2024年01月21日
    浏览(60)
  • 高精度算法详解

    首先要知道为什么需要高精度算法: 高精度算法是 处理大数字 的数学计算方法,当数字过大不能用 int 和 long long 存储时,我们就可以 使用string和vector类型 来存储他们的每一位,然后进行计算。 我们可以先把要输入的两个数字放到vector中存储,注意要 反着存(后边做加法

    2024年01月17日
    浏览(61)
  • C++高精度算法

    目录 前言:  思路: 高精度加法: 高精度减法: 高精度乘法: 高精度除法:  代码: 一、高精度加法 二、高精度减法  三、高精度乘法  四、高精度除法 最后         计算机最初、也是最重要的应用就是数值运算。在编程进行数值运算时,有时会遇到运算的精度要求特

    2024年02月14日
    浏览(54)
  • C++ 算法 高精度(较详细.)

            在我们进行计算的过程中,经常会遇到 几十位,甚至几百位的数字 的计算问题,也有可能会遇到小数点后几十位,几百位的情况,而我们面对这样的情况下,   和 的数据范围显然是 不够使用 的了。因此这时,我们就需要引入一个新的算法,叫做 高精度算法

    2023年04月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包