目录
一、知识点
1、高精度加法
高精度+高精度
2、高精度减法
高精度-高精度
3、高精度乘法
高精度*高精度
4、高精度除法
高精度/低精度
二、实战
p2142高精度减法
题目
解法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string s1,s2;
// 将字符串s中的数字倒序存入数组k
void reversal(string s,int k[])
{
for(int i=0;i<s.size();i++)
{
k[i]=s[s.size()-i-1]-'0';// 将字符转为数字并倒序存储
}
}
// 比较字符串s1和s2的大小,判断s1是否大于等于s2
bool judege(string a,string b)
{
if(a.size()!=b.size())
{
return a.size()>=b.size();// 长度不同,长度大的数字更大
}
return a>=b;// 长度相同,逐位比较大小
}
int main()
{
cin>>s1>>s2;
// 确保s1是较大的数字,如s2更大,交换s1和s2
if(!judege(s1, s2))
{
swap(s1, s2);
cout<<"-";
}
int la=s1.size(),lb=s2.size();
int lc=la;
int m1[la],m2[lb],m[lc];//自定义数组(长度)
reversal(s1, m1);
reversal(s2, m2);
// 逐位相减处理借位
for(int i=0;i<lc;i++)
{
m1[i]-=(i<lb?m2[i]:0);// 如果b的位数不足,按0处理
if(m1[i]<0)
{
m1[i]+=10;// 借位
m1[i+1]--;// 向高位借一位
}
m[i]=m1[i];// 将结果存入m
}
// 去除前导零
while(lc>1&&m[lc-1]==0) lc--;
for(int i=lc-1;i>=0;i--)
{
cout<<m[i];// 从高位到低位输出结果
}
return 0;
}
秒点
1.利用自定义的数组长度:为了防止数据溢出
2.改变了数组从0开始到size()
P1009 [NOIP1998 普及组] 阶乘之和
题目
解法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int a[1000],b[1000];
int main()
{
int n;
cin>>n;
for(int i=0;i<1000;i++)//初始化
{
a[i]=b[i]=0;
}
a[1]=1;
int temp;
for(int i=1;i<=n;i++)
{
temp=0;
for(int j=1;j<=1000;j++)//高精度乘法
{
a[j]=a[j]*i+temp;//注意进位
temp=a[j]/10;
a[j]=a[j]%10;
}
temp=0;
for(int j=1;j<=1000;j++)//高精度加法
{
b[j]=b[j]+a[j]+temp;//注意进位
temp=b[j]/10;
b[j]=b[j]%10;
}
}
int size=0;
for(int i=999;i>=0;i--)//寻找没有0的数组长度
{
if(b[i]!=0)
{
size=i;
break;
}
}
for(int i=size;i>=1;i--)
{
cout<<b[i];//逐一打印
}
return 0;
}
秒点
1.利用高精度乘法✖️结合高精度加法➕
P1015 [NOIP1999 普及组] 回文数
题目
题解
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
string m;
int ans;
int p;
bool hw(string st) {
int ln = st.size();
for (int i = 0; i < ln / 2; i++)
if (st[i] != st[ln - 1 - i]) return 0;
return 1;
}
int zhuan(char x) {
if (x >= '0' && x <= '9') return int(x - 48);
else {
if (x == 'A') return 10;
if (x == 'B') return 11;
if (x == 'C') return 12;
if (x == 'D') return 13;
if (x == 'E') return 14;
if (x == 'F') return 15;
}
}
char zhuan_h(int x) {
if (x >= 0 && x <= 9) return char(x + 48);
else {
if (x == 10) return char('A');
if (x == 11) return char('B');
if (x == 12) return char('C');
if (x == 13) return char('D');
if (x == 14) return char('E');
if (x == 15) return char('F');
}
}
string bian(string a, string b) {
for (int i = 0; i < b.size() / 2; i++)
swap(b[i], b[b.size() - 1 - i]);
string c = "";
int jw = 0, aw = 0, bw = 0, cw = 0;
for (int i = a.size() - 1; i >= 0; i--) {
aw = zhuan(a[i]);
bw = zhuan(b[i]);
cw = (aw + bw + jw) % n;
if (aw + bw + jw >= n) jw = 1;
else jw = 0;
c = zhuan_h(cw) + c;
}
if (jw == 1) c = '1' + c;
return c;
}
int main() {
cin >> n;
cin >> m;
p = hw(m);
while (p == 0) {
if (ans > 30) {
cout << "Impossible!";
exit(0);
}
ans++;
m = bian(m, m);
p = hw(m);
}
cout << "STEP=" << ans;
return 0;
}