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;
}