目录
一、双循环快速暴力求解
1、蓝桥杯第十一届真题—《门牌制作》
#include<iostream>
#include<algorithm>
using namespace std;
int cnt;
int main()
{
for (int i = 1; i <= 2020; i++)
{
for (int j = i; j; j /= 10)
if (j % 10 == 2) cnt++;
}
printf("%d", cnt);
return 0;
}
2、蓝桥杯第十届真题—《平方和》
#include<iostream>
#include<algorithm>
using namespace std;
long long sum;
int main()
{
for (int i = 1; i <= 2019; i++)
{
for (int j = i; j; j /= 10)
{
if (j % 10 == 2 || j % 10 == 0 || j % 10 == 1 || j % 10 == 9)
{
sum += i * i;
break;
}
}
}
printf("%lld", sum);
return 0;
}
3、蓝桥杯第十二届真题—《乘积尾零》
这道题有两种方法
1:就是直接算,算出两个数的乘积以后,先判断末尾有几个零,再之后,就可以把零去掉然后取数的后四位再与下一个数相乘。
2:分解质因数,看看有多少个5以及多少个2。
从后往前数0的个数
#include<iostream>
#include<algorithm>
using namespace std;
int a[11][11];
int cnt;
int main()
{
long long sum = 1;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
scanf("%d", &a[i][j]);
sum *= a[i][j];
while (sum % 10 == 0)
{
cnt++;
sum /= 10;
}
//if (sum > 10000)
sum = sum % 10000;
}
}
printf("% d", cnt);
return 0;
}
分解质因数法
#include<iostream>
using namespace std;
int a[11][11];
int cnt;
int sum2, sum5;
//分解质因子,数出2和5搭配的对数
//2的个数
int fun_2(int num)
{
int sum = 0;
while (num % 2 == 0)
{
num /= 2;
sum++;
}
return sum;
}
//5的个数
int fun_5(int num)
{
int sum = 0;
while (num % 5 == 0)
{
num /= 5;
sum++;
}
return sum;
}
int main()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j< 10; j++)
{
scanf("%d", &a[i][j]);
sum2 += fun_2(a[i][j]);
sum5 += fun_5(a[i][j]);
}
}
cnt = min(sum2, sum5);
//(sum2 + sum5) / 2;//错误写法
//(2 * sum2 + 5 * sum5) / 7;//错误写法
printf("%d", cnt);
return 0;
}
4、蓝桥杯第十二届真题—《卡片》
经典双循环
#include<iostream>
using namespace std;
int main()
{
int num1=2021,flag=0;
for(int i=1; ;i++)//不知道i到哪个数停止,所以i=1到...(未知)
{
flag=i;
for(int j=i;j;j/=10)//判断每个数i的每一位的数字是什么
{
if(j%10==1) num1--;
if(num1==0)
{
cout << flag << endl;
return 0;
}
}
}
}
异曲同工
#include <iostream>
using namespace std;
int num[10];
bool check(int x)
{
while (x)
{
int now = x % 10;
if (num[now] > 0)
num[now]--;
else
return false;
x /= 10;
}
return true;
}
int main()
{
for (int i = 0; i < 10; i++)
num[i] = 2021;
for (int i = 1; ;i++)
{
if (!check(i)) //如果该数i已经用完了
{
cout << i - 1 << endl;//这个i是拼不出来的,所以只能拼出i-1
break;
}
}
return 0;
}