目录
基础数学
1.LCM与GCD
#include<bits/stdc++.h>
using namespace std;
int gcd(int da,int xiao) //欧几里得算法,求最大公约数
{
int temp;
while(xiao!=0)
{
temp=da%xiao;
da=xiao;
xiao=temp;
}
return da;
}
int lcm(int a,int b)
{
int sum;
sum=a/gcd(a,b)*b;
return sum;
}
int main()
{
int a,b;
while(cin>>a>>b){
cout<<"最大公约数:"<<gcd(a,b)<<endl;
cout<<"最小公倍数:"<<lcm(a,b)<<endl;
}
return 0;
}
2.求n^n的个位
/*计算n个n相乘的结果的个位*/
#include<bits/stdc++.h>
using namespace std;
int _NN(int n);
int T_NN(int n);
int dg_pow(int n,int m); //递归
int _pow(int n,int m); //非递归
int a[10000001];
int main()
{
int n,m;
while(cin>>n){
m=n;
cout<<n<<"个"<<n<<"相乘的个位是:"<<_NN(n)<<endl;
cout<<n<<"个"<<n<<"相乘的个位是:";
T_NN(n);
cout<<"快速幂:"<<endl;
cout<< "递归方法求得的个位是 :"<<dg_pow(n,m)<<endl;
cout<<"非递归方法求得的个位是:"<<_pow(n,m)<<endl;
}
return 0;
}
int _NN(int n) //n>=1
{
int p=1;
for(int i=0;i<n;i++)
{
a[i]=n;
}
for(int i=0;i<n;i++)
{
a[i]=a[i]%10; //只取n的个位数字
p*=a[i]; //将n个数相乘
p=p%10; //将结果只取个位数字
}
return p;
}
int T_NN(int n)
{
if(n%10==0||n%10==1) cout<<"1"<<endl;
else if(n%10==2)
{
int a[4]={2,4,8,6};
cout<<a[(n-1)%4]<<endl;
}
else if(n%10==3)
{
int b[4]={3,9,7,1};
cout<<b[(n-1)%4]<<endl;
}
else if(n%10==4)
{
int c[2]={4,6};
cout<<c[(n-1)%2]<<endl;
}
else if(n%10==5) return 5;
else if(n%10==6) return 6;
else if(n%10==7){
int e[4]={7,9,3,1};
cout<<e[(n-1)%4]<<endl;
}
else if(n%10==8)
{
int f[4]={8,4,2,6};
cout<<f[(n-1)%4]<<endl;
}
else if(n%10==9){
int g[2]={9,1};
cout<<g[(n-1)%2]<<endl;
}
}
int dg_pow(int n,int m)
{
int sum;
if(m==0) sum=1;
else{
sum=dg_pow(n*n,m/2);
if(m%2==1) sum*=n;
m/=2;
sum%=10;
}
return sum;
}
int _pow(int n,int m)
{
int p=1;
while(m)
{
n%=10;
if(m%2==1) p*=n;
n=n*n;
m/=2;
p%=10;
}
return p;
}
3.判断fib数列是否被3整除
/* f0=7,f1=11,fn=fn-1+fn-2 n>=2 给定一个n判断fn是否被3整除,分别输出yes,no */
#include<bits/stdc++.h>
using namespace std;
int _fib(int n);
int _if(int n);
int _fib3(int n);
int a[10001];
int main()
{
int n;
while(cin>>n){
cout<<_fib(n)<<" ";
_if(n);
cout<<"被3整除"<<endl;
_fib3(n);}
return 0;
}
int _fib(int n)
{
a[0]=7,a[1]=11;
if(n>=2){
for(int i=2;i<=n;i++)
{
a[i]=a[i-1]+a[i-2]; //递推
}
}
return a[n-1];
}
int _if(int n)
{ //判断是否被3整除
if(_fib(n)%3==0) cout<<"YES";
else cout<<"NO";
}
int _fib3(int n)
{
a[0]=7,a[1]=11;
a[0]%=3;
a[1]%=3;
if(n>=2){
for(int i=2;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
a[i]%=3; //对3取模
}
}
if(a[n-1]==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
4.快速幂(递归与非递归)
/* 求A^B的最后三位数表示的整数 */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dg_pow(ll n,ll m);//递归
ll _pow(ll n,ll m); //非递归
int main()
{
ll a,b;
while(cin>>a>>b)
{
cout<<dg_pow(a,b)%1000<<endl;
cout<<_pow(a,b)%1000<<endl;
}
return 0;
}
ll dg_pow(ll n,ll m)
{
int ans;
if(m==0) ans=1;
else{
n%=1000;
ans=dg_pow(n*n,m/2); //递归调用
if(m%2==1) ans*=n; //m为奇数
ans%=10000;
}
return ans;
}
ll _pow(ll n,ll m)
{
int p=1;
while(m)
{
n%=1000;
if(m%2==1) p*=n;//奇数情况
n=n*n;
m=m/2;
p%=10000;
}
return p;
}