宝宝,文章都被你看光了,可以给我一个赞吗?拜托拜托❤️
或者点个关注也行谢谢宝宝💕
第一题:猜数字
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;
}