竞赛课期末考试(枚举、矩阵快速幂、双指针)

第一题:猜数字

46*79=23*158

要求找出所有的乘法等式,并1-9个数字只能用一次。

【参考代码】

暴力枚举

#include <bits/stdc++.h>
using namespace std;

map<int, int> mp;
bool isRepeat(int n1, int n2, int n3, int n4)
{
	mp.clear();
	while(n1)
	{
		mp[n1 % 10]++;
		n1 = n1 / 10;
	}
	while(n2)
	{
		mp[n2 % 10]++;
		n2 = n2 / 10;
	}
	while(n3)
	{
		mp[n3 % 10]++;
		n3 = n3 / 10;
	}
	while(n4)
	{
		mp[n4 % 10]++;
		n4 = n4 / 10;
	}
	for(int i=1; i<=9; i++)
	{
		if(mp.count(i) != 1)
			return false;
	}
	return true;
}

bool isOK(int n1, int n2, int n3, int n4){
	if(n1*n2 == n3*n4)
		return true;
	else
		return false;
}

int main()
{
 	for(int num1=1; num1<100; num1++)
 	{
 		for(int num2=1; num2<100; num2++)
 		{
 			for(int num3=1; num3<100; num3++)
 			{
 				int num4 = num1*num2 / num3;
 				if(num4 > 1000) //第四个数不能大于1000
 					continue; 
 				if(isRepeat(num1, num2, num3, num4) && isOK(num1, num2, num3, num4))
 				{
 					cout << num1 << '*' << num2 << '=' << num3 << '*' << num4 << endl;
				}
			}
		}
	}
 	return 0;
}

dfs深度优先搜索

#include <bits/stdc++.h>
using namespace std;
/*
2.猜数字
46*79=23*158
要求找出所有的乘法等式,并1-9个数字只能用一次。
*/
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

void dfs(int begin, int end)
{
	if(begin == end)
	{
		int number1 = a[1]*10 + a[2];
		int number2 = a[3]*10 + a[4];
		int number3 = a[5]*10 + a[6];
		int number4 = a[7]*100 + a[8]*10 + a[9];
		if(number1 * number2 == number3 * number4)
			cout << number1 << '*' << number2 << '=' << number3 << '*' << number4 <<endl;
		return;
	}
		
	for(int i = begin; i <= end; i++)
	{
		swap(a[begin], a[i]); 
		dfs(begin+1, end);
		swap(a[begin], a[i]); //换回来
	}
}

int main()
{
	dfs(1, 9); //求出9个数的所有全排列1-9
	return 0;
}

【运行结果】

第二题:求第1亿个Fibonacci数。(要求:用到取模运算与快速幂运算)

【参考代码】

#include <iostream>
using namespace std;
typedef long long ll;
const int mod = 1000000007;

struct matrix{
	ll a[2][2];
};

matrix start;
matrix result;

//(Fn+1) = (1, 1)^n * (F1)
//(Fn  )   (1, 0)  	  (F0)
//矩阵乘法
matrix matrix_multiplication(matrix matrix1, matrix matrix2)
{
	matrix temporary;
	temporary.a[0][0] = (matrix1.a[0][0] * matrix2.a[0][0] + matrix1.a[1][0] * matrix2.a[0][1]) % mod;
	temporary.a[0][1] = (matrix1.a[0][0] * matrix2.a[0][1] + matrix1.a[0][1] * matrix2.a[1][1]) % mod;
	temporary.a[1][0] = (matrix1.a[0][0] * matrix2.a[1][0] + matrix1.a[0][1] * matrix2.a[1][1]) % mod;
	temporary.a[1][1] = (matrix1.a[1][0] * matrix2.a[0][1] + matrix1.a[1][1] * matrix2.a[1][1]) % mod;
	return temporary;
}

//矩阵快速幂
void fastpow(int n)
{
	while(n)
	{
		if(n & 1) //位运算,最后一位是否为1
			result = matrix_multiplication(start, result);
			
		start = matrix_multiplication(start, start);
		n = n >> 1; //右移一位
	}
}

int main() //计算第1亿个Fibonacci数
{
 	int n = 1e8; //一亿
 	start.a[0][0] = start.a[0][1] = start.a[1][0] = 1, start.a[1][1] = 0;
 	//(1, 0)
 	//(0, 1)
 	result.a[0][0] = result.a[1][1] = 1, result.a[1][0] = result.a[0][1] = 0;
 	fastpow(n);
// 	cout << result.a[0][0] % mod << endl;
// 	cout << result.a[0][1] % mod << endl;
 	cout << result.a[1][0] % mod << endl;
// 	cout << result.a[1][1] % mod << endl;
 	return 0;
}
//100000000
//908460138

【运行结果】

第三题:【Acwing 2816. 判断子序列】

设A=<a1,a2,...,an>,B=<b1,b2,...bm>是两个序列,其中m<=n。设计一个算法,判断B是否为A的子序列。例如A=abcde ,B=acd,输出“134”;A=abcde,B=aca,输出“NO”。

【参考代码】

#include <bits/stdc++.h>
using namespace std;

int main() //双指针
{
 	string a, b, result;
 	int i=0, j=0, Count = 0;
 	cin>>a>>b;
 	for(i=0; i<a.size(); i++)
 	{
 		if(a[i] == b[j])
 		{
 			j++;
 			int temp = i;
 			result += to_string(++temp);
 			Count++; //计数
		}
	}
	//不匹配的判断
	if(Count != b.size())
	{
		cout << "NO" << endl;
	}
	else
	{
		cout << result << endl;
	}
 	return 0;
}

【运行结果】 


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值