一本通 2.1.1 高精度计算

1307:【例1.3】高精度乘法

【题目描述】

输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

char a[205];
char b[205];
char c[40005];
int main() {
	//input data
	cin >> a >> b;
	int lena = strlen(a);
	int lenb = strlen(b);
	for (int i = lena - 1; i >= 0; i--) {
		int temp = 0, nc = 0;
		int index = lena - 1 - i;
		int na = a[i] - '0';
		for (int j = lenb - 1; j >= 0; j--) {
			int nb = b[j] - '0';

			if (c[index] == 0) nc = 0;
			else nc = c[index] - '0';

			int sum = na * nb + temp + nc;
			int nab = sum % 10;
			temp = sum / 10;
			c[index] = nab + '0';
			index++;
		}
		while (temp != 0) {
			c[index] = temp % 10 + '0';
			temp /= 10;
			index++;
		}
	}
	int lenc = strlen(c);
	for (int i = lenc - 1; i >= 0; i--) {
		cout << c[i];
	}
	return 0;
}

1308:【例1.5】高精除

【题目描述】

高精除以高精,求它们的商和余数。

【题目分析】

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int a[101], b[101], c[101], d, i;
void init(int a[]) { //读取字符串并逆序转换为数组
	string s;
	cin >> s;
	a[0] = s.length();
	for (i = 1; i <= a[0]; i++)
		a[i] = s[a[0] - i] - '0';
}
void print(int a[]) { //打印输出函数
	int i;
	if (a[0] == 0) {
		cout << 0 << endl;
		return;
	}
	for (i = a[0]; i > 0; i--) cout << a[i];
	cout << endl;
	return;
}
int compare(int a[], int b[]) { //比较函数
	int i;
	if (a[0] > b[0]) return 1;
	if (a[0] < b[0]) return -1;
	for (i = a[0]; i > 0; i--) {
		if (a[i] > b[i]) return 1;
		if (a[i] < b[i]) return -1;
	}
	return 0;
}
void jian(int a[], int b[]) { //计算函数 a=a-b
	int flag, i;
	flag = compare(a, b);
	if (flag == 0) {
		a[0] = 0;
		return;
	}
	if (flag == 1) {
		for (i = 1; i <= a[0]; i++) {
			if (a[i] < b[i]) {
				a[i + 1]--;
				a[i] += 10;
			}
			a[i] -= b[i];
		}
		while (a[0] > 0 && a[a[0]] == 0) a[0]--; //修正位数
		return;
	}
}
void numcpy(int p[], int q[], int det) { //将p数组拷贝到q数组det的位置上
	for (int i = 1; i <= p[0]; i++) q[i + det - 1] = p[i];
	q[0] = p[0] + det - 1; //更新长度
}
void chugao(int a[], int q[], int c[]) {
	int i, tmp[101];
	c[0] = a[0] - b[0] + 1;
	for (i = c[0]; i > 0; i--) {
		memset(tmp, 0, sizeof(tmp));
		numcpy(b, tmp, i);
		while (compare(a, tmp) >= 0) {
			c[i]++;
			jian(a, tmp);
		}
	}
	while (c[0] > 0 && c[c[0]] == 0) c[0]--; //修正位数
	return;
}
int main() {
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));
	init(a), init(b);
	chugao(a, b, c);
	print(c);
	print(a);
	return 0;
}

1309:【例1.6】回文数(Noip1999)

【题目描述】

若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87,

STEP1: 87+78= 165 STEP2: 165+561= 726

STEP3: 726+627=1353 STEP4:1353+3531=4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<N<=10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int a[10005];
int b[10005];
bool isHui(int k) {
	int i = 1, j = k;
	while (i < k) {
		if (b[i] == b[j]) i++, j--;
		else break;
	}
	if (i < k)	return false;
	else return true;
}
int main() {
	//input data
	int n;
	cin >> n;
	string a1;
	cin >> a1;
	int lena = a1.size();
	for (int i = 0; i < lena; i++) {
		if (a1[i] >= '0' && a1[i] <= '9')
			b[i + 1] = a[i + 1] = a1[i] - '0';
		else
			b[i + 1] = a[i + 1] = a1[i] - 'A' + 10;
	}
	int i = 0;
	for (i = 0; i <= 30; i++) {
		if (isHui(lena)) break;
		int temp = 0;
		for (int j = 1; j <= lena; j++) {
			int sum = a[j] + a[lena - j + 1] + temp;
			b[j] = sum % n;
			temp = sum / n;
		}
		if (temp != 0) b[++lena] = temp;
		for (int j = 1; j <= lena; j++) a[j] = b[j];
	}
	if (i <= 30) cout << i;
	else cout << "Impossible";
	return 0;
}

1168:大整数加法

【题目描述】

求两个不超过200位的非负整数的和。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int a[205];
int b[205];
int c[205];
int main() {
	//input data
	string a1, b1;
	cin >> a1 >> b1;
	int lena = a1.size();
	int lenb = b1.size();
	for (int i = 0; i < lena; i++) {
		a[i] = a1[i] - '0';
	}
	for (int i = 0; i < lenb; i++) {
		b[i] = b1[i] - '0';
	}
	int i = lena - 1, j = lenb - 1;
	int sum = 0;
	int index = 0;
	while (i >= 0 || j >= 0) {
		if (i >= 0) sum += a[i--];
		if (j >= 0) sum += b[j--];
		c[++index] = sum % 10;
		sum /= 10;
	}
	if (sum != 0) c[++index] = sum;
	while (c[index] == 0) index--;
	for (int i = index; i >= 1; i--) {
		cout << c[i];
	}
	return 0;
}

1169:大整数减法

【题目描述】

求两个大的正整数相减的差。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int a[205], b[205], c[205];
int main() {
	//input data
	string a1, b1;
	cin >> a1 >> b1;
	int lena = a1.size();
	int lenb = b1.size();

	for (int i = 0; i < lena; i++) {
		a[i] = a1[i] - '0';
	}
	for (int i = 0; i < lenb; i++) {
		b[i] = b1[i] - '0';
	}
	int i = lena - 1, j = lenb - 1;
	int temp = 0, index = 0;
	while (i >= 0) {
		int d = a[i--] + temp;
		if (j >= 0) d -= b[j--];
		if (d < 0) d += 10, temp = -1;
		else temp = 0;
		c[++index] = d;
	}
	while (c[index] == 0) index--;
	for (int i = index; i >= 1; i--) {
		cout << c[i];
	}
	return 0;
}

1170:计算2的N次方

【题目描述】

任意给定一个正整数N(N<=100),计算2的n次方的值。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int c[300];
int main() {
	//input data
	int n;
	cin >> n;
	c[1] = 1;
	int index = 1;
	for (int i = 1; i <= n; i++) { //乘以i个2
		int temp = 0;
		for (int j = 1; j <= index; j++) {
			int sum = c[j] * 2 + temp;
			c[j] = sum % 10;
			temp = sum / 10;
		}
		if (temp != 0) c[++index] = temp;
	}
	for (int i = index; i >= 1; i--) {
		cout << c[i];
	}
	return 0;
}

1171:大整数的因子

【题目描述】

已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int a[35];
int main() {
	//input data
	string a1;
	cin >> a1;
	int lena = a1.size();
	for (int i = 0; i < lena; i++) {
		a[i] = a1[i] - '0';
	}
	bool flag = true;
	for (int i = 2; i <= 9; i++) {
		//判断a[35]能否整除i
		int temp = 0;
		for (int j = 0; j < lena; j++) {
			int sum = a[j] + temp * 10;
			temp = sum % i;
		}
		if (temp == 0) flag = false, cout << i << " ";
	}
	if (flag)cout << "none";
	return 0;
}

1172:求10000以内n的阶乘

【题目描述】

求10000以内n的阶乘。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int a[1000000];
int main() {
	//input data
	int n;
	cin >> n;
	a[1] = 1;
	int index = 1;
	for (int i = 1; i <= n; i++) {
		int temp = 0;
		for (int j = 1; j <= index; j++) {
			int sum = a[j] * i + temp;
			a[j] = sum % 10;
			temp = sum / 10;
		}
		while (temp != 0) {
			a[++index] = temp % 10, temp /= 10;
		}
	}
	for(int i=index;i>=1;i--){
		cout<<a[i];
	}

	return 0;
}

1173:阶乘和

【题目描述】

用高精度计算出S=1!+2!+3!+…+n!(n≤100),其中“!!”表示阶乘,例如:5!=5×4×3×2×1

输入正整数n,输出计算结果S。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int a[1000000];
int s[1000000];
int getn(int n) {
	int index = 1;
	memset(a, 0, sizeof(a));
	a[1] = 1;
	for (int i = 1; i <= n; i++) {
		int temp = 0;
		for (int j = 1; j <= index; j++) {
			int sum = a[j] * i + temp;
			a[j] = sum % 10;
			temp = sum / 10;
		}
		while (temp != 0) {
			a[++index] = temp % 10, temp /= 10;
		}
	}
	return index;
}
int main() {
	//input data
	int n;
	cin >> n;
	int maxs = 0;
	for (int i = 1; i <= n; i++) {
		int index = getn(i);
		int temp = 0;
		for (int j = 1; j <= index; j++) {
			int sum = a[j] + s[j] + temp;
			s[j] = sum % 10;
			temp = sum / 10;
		}
		while (temp != 0) {
			int sum = temp + s[++index];
			s[index] = sum % 10;
			temp = sum / 10;
		}
		if (maxs < index) maxs = index;
	}
	for (int i = maxs; i >= 1; i--) {
		cout << s[i];
	}
	return 0;
}

1174:大整数乘法

【题目描述】

求两个不超过200位的非负整数的积。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

char a[205];
char b[205];
char c[40005];
int main() {
	//input data
	cin >> a >> b;
	int lena = strlen(a);
	int lenb = strlen(b);
	for (int i = lena - 1; i >= 0; i--) {
		int temp = 0, nc = 0;
		int index = lena - 1 - i;
		int na = a[i] - '0';
		for (int j = lenb - 1; j >= 0; j--) {
			int nb = b[j] - '0';

			if (c[index] == 0) nc = 0;
			else nc = c[index] - '0';

			int sum = na * nb + temp + nc;
			int nab = sum % 10;
			temp = sum / 10;
			c[index] = nab + '0';
			index++;
		}
		while (temp != 0) {
			c[index] = temp % 10 + '0';
			temp /= 10;
			index++;
		}
	}
	int lenc = strlen(c);
	for (int i = lenc - 1; i >= 0; i--) {
		cout << c[i];
	}
	return 0;
}

1175:除以13

【题目描述】

输入一个大于0的大整数N,长度不超过100位,要求输出其除以13得到的商和余数。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

int a[105];
int b[105];
int c;
int main() {
	//input data
	string str;
	cin >> str;
	int lens = str.size();
	for (int i = 0; i < lens; i++) {
		a[i + 1] = str[i] - '0';
	}
	int temp = 0;
	for (int i = 1; i <= lens; i++) {
		int sum = a[i] + temp * 10;
		b[i] = sum / 13;
		temp = sum % 13;
	}
	int j = 1;
	while (b[j] == 0) j++;
	for (int i = j; i <= lens; i++) {
		cout << b[i];
	}
	cout << endl << temp;

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值