复兴提高班第二十六课 高精度乘除
2025-11-23 15:16:17
发布于:上海
T1A*B Problem
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string x , y;
int a[50010] , b[50010] , c[50010];
int main()
{
cin >> x >> y;
int l1=x.size() , l2 = y.size();
for(int i = 1 ; i <= l1 ; i++){
a[i] = x[l1-i]-'0';
}
for(int i = 1 ; i <= l2 ; i++){
b[i] = y[l2-i]-'0';
}
for(int i = 1 ; i <= l1 ; i++){
for(int j = 1 ; j <= l2 ; j++){
c[i+j-1] += a[i] * b[j];
}
}
int l = l1 + l2;
for(int i = 1 ; i <= l - 1 ; ++i){
if(c[i] > 9){
c[i+1] += c[i] / 10;
c[i] %= 10;
}
}
while(c[l] == 0 && l > 1){
l--;
}
for(int i = l ; i >= 1 ; i--){
cout << c[i];
}
return 0;
}
T2阶乘之和
#include<bits/stdc++.h>
using namespace std;
int mul[10010] = {1}, add[10010];
int main(){
int n, l = 2;
cin >> n;
for(int i = 1;i <= n;i++){
for(int j = 0;j < l;j++){
mul[j] *= i;
}
l += 2;
for(int j = 0;j < l;j++){
mul[j + 1] += mul[j] / 10;
mul[j] %= 10;
}
for(int j = 0;j < l;j++){
add[j] += mul[j];
add[j + 1] += add[j] / 10;
add[j] %= 10;
}
}
int idx = l;
while(!add[idx]) idx--;
for(int i = idx;i >= 0;i--) cout << add[i];
return 0;
}
T3A/B Problem
#include <iostream>
using namespace std;
int a[10010], b, c[10010];
int main() {
string s1;
cin >> s1 >> b;
int l1 = s1.size();
for (int i = 0; i < l1; i++)
a[i] = s1[i] - '0';
long long r = 0;
for (int i = 0; i < l1; i++) {
r = a[i] + r * 10;
c[i] = r / b;
r %= b;
}
int len = 0;
while(!c[len] && len < l1 - 1){
len++;
}
for (int i = len; i < l1; i++){
cout << c[i];
}
cout << endl << r;
return 0;
}
T4天使的起誓
#include<bits/stdc++.h>
using namespace std;
int n , ans , a[1005];//定义
string m;
int main(){
cin >> n >> m;//输入
for(int i = 0 ; i < m.size() ; i++){
a[i] = m[i] - '0';
}
for(int i = 0 ; i < m.size() ; i++){
ans = (ans * 10 + a[i]) % n;//逐位取数求余
}
if(ans==0){
cout << n;
}else{
cout << ans;//输出
}
return 0;
}
T5阶乘数码
#include<bits/stdc++.h>
using namespace std;
int n[10001],s,t,m,x,y,cnt,yu;
void lgx(int t){
n[1] = 1;//初始化
s = 1;
for(int i = 1 ; i <= t ; i++){
yu = 0;//清除余数
for(int j = 1 ; j <= s ; j++){
n[j] = n[j] * i + yu;//千万不能先加余数,会影响下一次乘法运算时的值!
yu = n[j] / 10;//余数计算
n[j] %= 10;
}//进位
n[s+1] += yu;//最后一个余数没有参与计算
while(n[s+1]){
//处理位数
if(n[s+1] >= 10){
n[s+2] = n[s+1] / 10;
n[s+1] %= 10;
}
s++;
}
}
}
int main(){
cin >> m;
for(int i = 1 ; i <= m ; i++){
//scanf("%d%d",&mzy,&zjq);
cin >> x >> y;
lgx(x);//阶乘
for(int j = s ; j >= 1 ; j--){
if(y == n[j]){//统计个数
cnt++;
}
}
printf("%d\n",cnt);
memset(n,0,sizeof(n));//清0
cnt = 0;
}
return 0;
}
这里空空如也












有帮助,赞一个