0
点赞
收藏
分享

微信扫一扫

大数加、减、乘、除、阶乘模板

Aliven888 2022-06-17 阅读 31

阶乘

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int res[20005];//[0]->个位
void jiecheng(int n){ //n的阶乘
res[0]=1; //个位为1
int cf=0; //进位为0
for (int i=2; i<=n; i++){ //2到n相乘
for (int j=0; j<20005; j++){ //res[]中每个元素与i相乘,多位乘1位不会爆int
int s = res[j]*i + cf;
cf = s/10;
res[j] = s%10;
}
}
int pos;
for (int i=20000; i>=0; i--){
if (res[i]!=0){
pos=i;
break;
}
}
for (int i=pos; i>=0; i--){
printf("%d", res[i]);
}
}
int main(){
int n;
cin>>n;
jiecheng(n);
return 0;
}

加、减、乘、除

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

int a[2000], b[2000], c[2000];
void jiafa(string str1, string str2){
//c=a+b
a[0]=str1.length();
for (int i=1; i<=a[0]; i++)
a[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for (int i=1; i<=b[0]; i++)
b[i]=str2[b[0]-i]-'0';

int len = max(a[0], b[0]);
for (int i=1; i<=len; i++){
c[i] += a[i]+b[i];
c[i+1] = c[i]/10;
c[i]= c[i]%10;
}
len++;
while (c[len]==0 && len>1)//>1很重要,有可能是0
len--;
for (; len>=1; len--){
printf("%d", c[len]);
}
}
int compare_string(string str1, string str2){
//str1>=str2-->return 0; else return 1;
if (str1.length()>str2.length()) return 0;
if (str1.length()<str2.length()) return 1;
for (int i=0; i<str1.length(); i++){
if (str1[i]>str2[i]) return 0;
if (str1[i]<str2[i]) return 1;
}
return 0;
}
void jianfa(string str1, string str2){
//c=a-b
a[0]=str1.length();
for (int i=1; i<=a[0]; i++)
a[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for (int i=1; i<=b[0]; i++)
b[i]=str2[b[0]-i]-'0';

int flag = compare_string(str1, str2);
if (flag==0){
for (int i=1; i<=a[0]; i++){
c[i] = a[i]-b[i];
if (c[i]<0){
c[i]+=10;
c[i+1]-=1;
}
int len = a[0]+1;
while (c[len]==0 && len>1)
len--;
for (; len>=1; len--)
printf("%d", c[len]);
}
}else{
printf("-");
for (int i=1; i<=b[0]; i++){
c[i] = b[i]-a[i];
if (c[i]<0){
c[i]+=10;
c[i+1]--;
}
}
int len=b[0]+1;
while (c[len]==0 && len>1)
len--;
for (; len>=1; len--)
printf("%d", c[len]);
}
}
void chengfa(string str1, string str2){
//c=axb
a[0]=str1.length();
for (int i=1; i<=a[0]; i++)
a[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for (int i=1; i<=b[0]; i++)
b[i]=str2[b[0]-i]-'0';

for (int i=1; i<=a[0]; i++){
for (int j=1; j<=b[0]; j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
int len=a[0]+b[0]+1;
while (c[len]==0 && len>1)
len--;
for (; len>=1; len--)
printf("%d", c[len]);
}
void chufa_low(string str1, string str2){
//c=a/b
a[0] = str1.length();
//注意除法为正序放
for (int i=1; i<=a[0]; i++)
a[i] = str1[i-1]-'0';
int b = atoi(str2.c_str());
int x=0;//高位余数

for (int i=1; i<=a[0]; i++){
c[i] =(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
int len=1;
while (c[len]==0 && len<a[0])
len++;
for (; len<=a[0]; len++)
printf("%d", c[len]);
}
int compare_string(int a[], int b[]){
if (a[0]>b[0]) return 0;
if (a[0]<b[0]) return 1;
for (int i=a[0]; i>=1; i--){//从高位到低位比较a,b
if (a[i]>b[i]) return 0;
if (a[i]<b[i]) return 1;
}
return 0;
}
void sub(int a[], int b[]){
//a = a - b
for (int i=1; i<=a[0]; i++){
a[i] = a[i]-b[i];
if (a[i]<0){
a[i+1]--;
a[i]+=10;
}
}
while (a[a[0]]==0 && a[0]>1)
a[0]--;
}
void chufa_high(string str1, string str2){
//c = a / b
a[0]=str1.length();
for (int i=1; i<=a[0]; i++)
a[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for (int i=1; i<=b[0]; i++)
b[i]=str2[b[0]-i]-'0';

int tmp[2000];
c[0]=max((a[0]-b[0]), 0)+1;

for (int i=c[0]; i>=1; i--){
memset(tmp, 0, sizeof(tmp));
for (int j=1; j<=b[0]; j++)
tmp[i+j-1]=b[j];
tmp[0] = b[0]+i-1;

while (compare_string(a, tmp)==0){
c[i]++;
sub(a, tmp);
}
}
//商
while (c[c[0]]==0 && c[0]>1)
c[0]--;
for (int i=c[0]; i>=1; i--)
printf("%d", c[i]);
printf("\n");
//余数
for (int i=a[0]; i>=1; i--)
printf("%d", a[i]);
}
int main(){
string str1, str2;
cin>>str1>>str2;
chufa_high(str1, str2);
return 0;
}


举报

相关推荐

0 条评论