1.幂次方
#include<iostream>
#include<string>
using namespace std;
int a[1007]={1};
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=0;j<=1000;j++){
a[j]*=m;
//需要单独处理进位,把进位调到这里有问题
//进位在下面:2^4=16;进位在这:2^4=26
}
for(int j=0;j<=1000;j++){
//进位
a[j+1]=a[j+1]+a[j]/10;
a[j]%=10;
}
}
int ptr=0;//指针,标记输出位置
for(int i=1000;i>=0;i--){//倒序找出,倒序输出,列表:4 0 2 1,输出:1024
if(a[i]>0){
ptr=1;//找到了(不是0的时候,也能用a[i]!=0)
}
if(ptr==1){//如果找到,倒序输出
cout<<a[i];
}
}
return 0;
}
2.mod(先除,在乘,最后减)
5mod 3,先除,[5/3]=1(向下取整)1*3=3, 5-3=2,利用向下取整的特性,就能MOD了(高%低精度)
#include<bits/stdc++.h>
using namespace std;
int divide(int *a,int b,int *c,int *r,int len){
int lenc=len-1;
*r=0;
while(lenc>=0){
int d=(*r)*10+a[lenc];
c[lenc]=d/b;
*r=d%b;
lenc--;
}
for(lenc=len-1;lenc>=0;lenc--){
if(c[lenc]!=0)break;
}
return ++lenc;
}
int main(){
int defsum=0;
const int N=100010;
int a[N],b,c[N],r;
string def;
int defi=0;
memset(a,0,sizeof(a));memset(c,0,sizeof(c));
string opa;
cin>>opa>>b;
b=b;
int lena=opa.size();;
for(int i=lena-1;i>=0;i--)a[lena-i-1]=opa[i]-'0';
int lenc=divide(a,b,c,&r,lena);
for(int i=lenc-1;i>=0;i--){
cout<<c[i];
def+=c[i]+'0';
//defi++;
}
cout<<endl;
string s=def;
int n=b;
for(int i=0;i<lena;i++)a[i]=0;
int x=0;
int b1[1005];
int len=s.size();
for(int i=0;i<len;i++){
a[i]=s[len-1-i]-'0';
}
for(int i=0;i<len;i++){
a[i]=(a[i]*n)+x;
x=a[i]/10;
a[i]%=10;
if(i==len-1&&x>0){
len++;
}
}
// int l=lena+lenb;
// while(c[l-1]==0&&l>1){
// l--;
// }
string str2;
for(int i=len-1;i>=0;i--){
//cout<<a[i];
str2+=a[i]+'0';
}
for(int i=0;i<lena;i++){
a[i]=0;
}
for(int i=0;i<lenc;i++){
c[i]=0;
}
string s1=opa,s2=str2;
int lena1=s1.size();
for(int i=0;i<lena1;i++){
a[i]=s1[lena-i-1]-'0';
}
int lenb1=s2.size();
for(int i=0;i<lenb1;i++){
b1[i]=s2[lenb1-i-1]-'0';
}
int len1=max(lena1,lenb1);
for(int i=0;i<len1;i++){
c[i]+=a[i]-b1[i];
if(c[i]<0){
c[i+1]--;
c[i]+=10;
}
}
while(c[len1-1]==0&&len1>1){
len1--;
}
for(int i=len1-1;i>=0;i--){
cout<<c[i];
}
return 0;
}