主页:(*´∇`*) 咦,又好了~ xiaocr_blog
(1)数据的接收方法和存储方法:
当输入的数据很长的时候,可采取字符串方式输入,这样可以输入位数很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。
(2)高精度数位数确定:
位数确定:接收时往往是用字符串的,所以它的位数就等于字符串长度。
(3)高精度除法分为竖式除法还有模拟减法两种
//加法进位 c[i] = a[i] + b[i]
if(c[i]>=10){c[i] %= 10;++c[i+1];}
//减法借位
if(a[i]<b[i]){--a[i+1];a[i]+=10;c[i] = a[i] - b[i] }
//高除低除法储存无需倒置,竖式除法
//高除高为减法模拟除法
#include<bits/stdc++.h>
using namespace std;
int main() {char a1[100], b1[100];int a[100], b[100], c[100];memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));gets_s(a1);gets_s(b1);int lena = strlen(a1);int lenb = strlen(b1);for (int i = 0; i <= lena - 1; i++) {a[lena - i] = a1[i] - '0';}for (int i = 0; i <= lenb - 1; i++) {b[lenb - i] = b1[i] - '0';}int lenc = 1;int x = 0;while (lenc <= lena || lenc <= lenb) {c[lenc] = a[lenc] + b[lenc]+x;x = c[lenc] / 10;c[lenc] %= 10;lenc++;}c[lenc] = x;if (c[lenc] == 0) {//处理最高位lenc--;}for (int i = lenc; i >= 1; i--) {cout << c[i];}return 0;
}
#include<bits\stdc++.h>
using namespace std;
int main() {char a1[100], b1[100],q[100];int a[100], b[100], c[100];memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));gets(a1);gets(b1); if (strlen(a1) < strlen(b1) || (strlen(a1) == strlen(b1)&&strcmp(a1, b1) < 0)) {strcpy(q, a1);strcpy(a1, b1);strcpy(b1, q);cout << "-";}int lena = strlen(a1);int lenb = strlen(b1);for (int i = 0; i <= lena - 1; i++) {a[lena - i] = a1[i] - '0';}for (int i = 0; i <= lenb - 1; i++) {b[lenb - i] = b1[i] - '0';}int lenc = 1;while (lenc <= lena || lenc <= lenb) {if (a[lenc] < b[lenc]) {a[lenc] += 10; a[lenc + 1]--;}c[lenc] = a[lenc] - b[lenc];lenc++;}lenc--;while ((c[lenc] == 0) && (lenc > 1)) {lenc--;}for (int i = lenc; i >= 1; i--) {cout << c[i];}return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){char a1[101],b1[101];int a[101],b[101],c[101];int lena,lenb,lenc;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));gets(a1),gets(b1); lena = strlen(a1);lenb = strlen(b1);for(int i =0;i<=lena-1;i++){a[lena-i] = a1[i] - '0';}for(int i =0;i<=lenb-1;i++){b[lenb-i] = b1[i] - '0';}for(int i =1;i<=lena;i++){for(int j =1;j<=lenb;j++){c[i+j-1] += a[i]*b[j];c[i+j] += c[i+j-1]/10;c[i+j-1]%=10;}}lenc = lena + lenb;if(c[lenc]==0&&lenc>=1){lenc--;}for(int i =lenc;i>=1;i--){cout<<c[i];}return 0;
}
#include<bits/stdc++.h>
using namespace std;
char a1[101];
int a[101],c[101],x;
long long b;
int main(){cin>>a1>>b;int lena = strlen(a1);for(int i =1;i<=lena;i++){a[i] = a1[i-1] - '0';}for(int i=1;i<=lena;i++){c[i] = (10*x+a[i])/b;x = (10*x+a[i])%b;}int lenc =1;while(c[lenc]==0&&lenc<lena){lenc++;}for(int i = lenc;i<=lena;i++){cout<<c[i];}return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[101], b[101], c[101];
void init(int a[]) {char st[101];cin >> st;a[0] = strlen(st);for (int i = 1; i <= a[0]; i++) {a[i] = st[a[0]-i] - '0';}
}
void output(int a[]) {if (a[0] == 0) {cout << 0;return;}for (int i = a[0]; i >= 1; i--) {cout << a[i];}
}
int compare(int a[], int b[]) {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;
}
void minus_(int a[], int b[]) {int flag;flag = compare(a, b);if (flag == 0) {a[0] = 0;return;}if (flag == 1) {for (int i = 1; i <= a[0]; i++) {if (a[i] < b[i]) {a[i + 1]--; a[i] += 10;}a[i] -= b[i];}while (a[a[0]] == 0 && a[0] > 0) {a[0]--;}return;}
}
void numcpy(int p[], int q[], int 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 b[], int c[]) {int tem[101];c[0] = a[0] - b[0] + 1;for (int i = c[0]; i >= 1; i--) {memset(tem, 0, sizeof(tem));numcpy(b, tem, i);while (compare(a, tem) > 0) {c[i]++;minus_(a, tem);}}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);output(c);return 0;
}
1.大整数的加法
#include<bits/stdc++.h>
using namespace std;
char a1[101], b1[101];
int a[101], b[101], c[101];
int lena, lenb, lenc;
int main() {cin >> a1 >> b1;lena = strlen(a1); lenb = strlen(b1);for (int i = 0; i <= lena - 1; i++) {a[lena - i] = a1[i] - '0';}for (int i = 0; i <= lenb - 1; i++) {b[lenb - i] = b1[i] - '0';}lenc = 1;while (lenc <= lena || lenc <= lena) {lenc++;}int x = 0;for (int i = 1; i <= lenc; i++) {c[i] = a[i] + b[i] + x;x = c[i] / 10;c[i] %= 10;}while (c[lenc] == 0 && lenc > 0) {lenc--;}for (int i = lenc; i >=1; i--) {cout << c[i];}return 0;
}
2.给定一个整数,计算2的N次方
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int N;
int main() {a[1] = 1;cin >> N;int k = 1,x=0;for (int j = 1; j <= N; j++) {x = 0;for (int i = 1; i <= k; i++) {a[i] = a[i] * 2 + x;x = a[i] / 10;a[i] %= 10;if (x != 0 && i == k) {k++;//伸缩}}}for (int i = k; i >= 1; i--) {cout << a[i];}return 0;
}
3.大整数的因子
#include<bits/stdc++.h>
using namespace std;
char a1[101];
int a[101], c[101], lena,b, x;
int main() {cin >> a1;lena = strlen(a1);for (int i = 1; i <= lena; i++) {a[i] = a1[i - 1] - '0';}for (int i = 2; i <= 9; i++) {x = 0;for (int j = 1; j <= lena; j++) {c[j] = (a[j] + x * 10) / i;x = (10 * x + a[j]) % i;}if (x % i == 0) {cout << i << " ";}}return 0;
}
4.*10000以内n的阶乘
#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001];
int main(){int n,fac,k=1;cin>>n;a[1] = 1;for(int i =1;i<=n;i++){for(int j =1;j<=k;j++){a[j] = a[j]*i;a[j]= a[j-1]/10+a[j];a[j-1] = a[j-1]%10;if(a[j]>=10&&j>=k){k++;}}}for(int i =k;i>=1;i--){cout<<a[i];}return 0;
}
5*.高精度计算之阶乘和
#include<bits/stdc++.h>
using namespace std;
int a[10001], sum[10001], n;
void getsum(int a[], int b[]) {int tem[10001] = { 0 };int x = 0;for (int i = 1; i <= 10001; i++) {tem[i] = a[i] + b[i] + x;x = tem[i] / 10;tem[i] %= 10;}for (int i = 1; i <= 10001; i++) {b[i] = tem[i];}
}
int main() {cin >> n;for (int i = 1; i <= n; i++) {memset(sum, 0, sizeof(sum));a[1] = 1; int k = 1;for (int j = 1; j <= i; j++) {for (int p = 1; p <= k; p++) {a[p] = a[p] * j;a[p] = a[p - 1] / 10 + a[p];a[p - 1] = a[p - 1] % 10;if (a[p] >= 10 && p >= k) {k++;}}}getsum(a, sum);}int t = 10001;while (sum[t] == 0) {t--;}for (int i = t; i >= 1; i--) {cout << sum[i];}return 0;
}
#include<stdio.h>
#define N 10000
int main()
{int i, j, x, k, n, b[N] = { 0 };scanf("%d", &n);for (k = 1; k <= n; k++){int a[N] = { 0 };a[9999] = 1;for (i = 1, x = 0; i <= k; i++) {for (j = 9999; j >= 0; j--){a[j] = a[j] * i + x;x = a[j] / 10;a[j] = a[j] % 10;}}for (j = 9999; j >= 0; j--){b[j] = b[j] + a[j];if (b[j] >= 10){b[j - 1] = b[j - 1] + 1;b[j] = b[j] - 10;}}}for (i = 0; i < N; i++)if (b[i] != 0) break; for (x = i; x < N; x++)printf("%d", b[x]);return 0;
}
6.大整数乘法
#include<bits/stdc++.h>
using namespace std;
char a1[10001], b1[10001];
int a[10001], b[10001], c[10001];
int main() {int lena, lenb, lenc;cin >> a1 >> b1;lena = strlen(a1);lenb = strlen(b1);for (int i = 0; i <= lena-1; i++) {a[lena - i] = a1[i] - '0';}for (int i = 0; i <= lenb-1; i++) {b[lenb - i] = b1[i] - '0';}lenc = lena + lenb;for (int i = 1; i <= lena; i++) {for (int j = 1; j <= lenb; j++) {c[i + j - 1] += b[j] * a[i];c[i + j] += c[i + j - 1] / 10;c[i+j-1]%= 10;}}lenc = lena + lenb;while(c[lenc] == 0 && lenc > 0) {lenc--;}for (int i = lenc; i >= 1; i--) {cout << c[i];}return 0;
}
7.大整数除以13,输出商和余数
#include<bits/stdc++.h>
using namespace std;
char a1[10001];
int a[10001],b[101];
const int n = 13;
int x;
int main() {cin >> a1;int lena = strlen(a1);for (int i = 1; i <= lena; i++) {a[i] = a1[i - 1]-'0';}for (int i = 1, x = 0; i <= lena; i++) {b[i] = (a[i] + x * 10) / 13;;x = (a[i] + x * 10) % 13;}int len = 1;while (b[len] == 0&&len<lena) {len++;}for (int i = len; i <= lena; i++) {cout << b[i];}cout << endl;cout << x;return 0;
}