几道HDOJ数学题

时间:2022-10-06 21:53:42

HDOJ 1061 题目描述

/*
HDOJ 1061
求n^n 的个位,和求(n%10)^n是一样的,然后再利用快速求幂算法
*/

#include <iostream>
using namespace std;

int digit(int a,int n)
{
if(n == 0)
return 1;
if(n == 1)
return a;
else{
int temp;
if(n % 2 == 0){
temp=digit(a,n/2);
temp=temp*temp%10;
return temp;
}
else{
temp=a*digit(a,n-1)%10;
return temp;
}
}
}

int main()
{
int nCase,n,a;
cin>>nCase;
while(nCase--)
{
cin>>n;
a=n%10;
if((a == 0) || (a == 1))
cout<<a<<endl;
else
cout<<digit(a,n)<<endl;
}
return 0;
}

HDOJ 1108 最小公倍数

#include <iostream>
using namespace std;

//最大公约数
int gcd(int big,int small)
{
int temp;
while(small != 0)
{
temp=big%small;
big=small;
small=temp;
}
return big;
}

int main()
{
int a,b;
while(cin>>a>>b)
{
if(a<b)
{
a=a-b;
b=a+b;
a=b-a;
}
cout<<a*b/gcd(a,b)<<endl;
}
return 0;
}

HDOJ 1425 Sort

/*
HDOJ 1425
由于数据全都不重复,而且范围也已经给出,
所以就用HASH思想就可以了
大数组一般声明为全局变量,不然容易栈溢出
*/

#include <iostream>
using namespace std;

int a[1000001];

int main()
{
int m,n,num,count,i;
while(scanf("%d %d",&n,&m) != EOF)
{
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%d",&num);
a[num+500000]=1;
}
count=0;
for(i=1000000;i>=0;i--)
{
if(a[i])
{
count++;
if(count == m)
printf("%d\n",i-500000);
else
printf("%d ",i-500000);
}
if(count == m)
break;
}
}
return 0;
}

HDOJ 2035 人见人爱A^B

/*
HDOJ 2035
求A^B的后三位数,和用A的后三位数求B次方结果是一样的
*/

#include <iostream>
using namespace std;

int digit(int a,int b)
{
if(b == 0)
return 1;
else if(b == 1)
return a;
else
{
int temp;
if(b & 0x01)
{
temp=a*digit(a,b-1)%1000;
return temp;
}
else
{
temp=digit(a,b/2);
temp=temp*temp%1000;
return temp;
}
}
}

int main()
{
int m,n,a,b;
while(cin>>m>>n)
{
if((m == 0) && (n == 0))
break;
a=m%1000;
b=n;
if((a == 1) || (a == 0))
cout<<a<<endl;
else
cout<<digit(a,b)<<endl;
}
return 0;
}


HDOJ 1005 Number Sequence

/*
HDOJ 1005
这道题的范围很大,所以一定是找规律的题目,开始是1,1
所以只要找到再出现是1,1的,那么它之前的就是一次循环
比如,1,1,2,3,5,1,6,0,6,6,5,4,2,6,1,0,1,1
去掉最后两个1,这便是一次循环。
接下来,只要根据所给的n来对循环所包含的个数取余就可以了。
*/

#include <iostream>
using namespace std;

int f[51];

int main()
{
int a,b,n,i;
while(cin>>a>>b>>n)
{
if(!(a+b+n))
break;
f[1]=1;
f[2]=1;
for(i=3;i<51;i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if((f[i] == f[1]) && (f[i-1] == f[2]))
break;
}
i -= 2; //减去最后两个1
n=n%i;
if(n == 0)
n=i;
cout<<f[n]<<endl;
}
return 0;
}
HDOJ 1021 Fobinacci Again

/*
HDOJ 1021
先对f(n-1)和f(n-2)模3处理,然后再求f(n)%3,写到十几项的时候,就会发现规律了
*/

#include <iostream>
using namespace std;

int main()
{
int n;
while(cin>>n)
{
if((n%8 == 2) || (n%8 == 6))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}