几道HDOJ数学题

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值