洛谷打卡 Day7
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 a,b( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入
5 500
输出
5
7
11
101
131
151
181
191
313
353
373
383
看着挺简单,一写发现老是超时要不断地简化
首先除了2以外的正偶数都不可能是质数
判断回文快,且数量少。看大佬说printf比cout要快
9989899是最大的符合题意的数字,10009999和100000999999里没有符合要求的数字
有一种玄学的证明方法,有偶数位的回文数(除了11)必然不是质数

另一种比较简洁的判断回文,思路就是把这个数倒过来。
题解
#include<bits/stdc++.h>
using namespace std;
int a, b;
bool check1(int x)
{
if((1000 <= x && x <= 9999) || (100000 <= x && x <= 999999))
return 0;
return 1;
}
bool check2(int x)
{
int a[20];
int flag=1;
while(x>0)
{
a[flag] = x % 10;
x /= 10;
flag++;
}
for (int i = 1; i <= flag / 2; i++)
if(a[i] != a[flag-i])
return 0;
return 1;
}
bool check3(int x)
{
if(x == 2) return 1;
int k=sqrt(x);
for(int i = 2; i <= k; i++)
if(x % i == 0) return 0;
return 1;
}
int main()
{
scanf("%d %d", &a, &b);
if(a == 2) printf("2\n");
if(a % 2 == 0) a++;
b = min(9999999, b);
for(int i = a; i <= b; i = i + 2)
{
if(check1(i) == 0) continue;
if(check2(i) == 0) continue;
if(check3(i) == 0) continue;
printf("%d\n", i);
}
return 0;
}
题目描述
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0−9的拼法如图所示:
注意:
加号与等号各自需要两根火柴棍
如果A≠B,则A+B=C与B+A=C视为不同的等式(A,B,C>=0)
n根火柴棍必须全部用上
输入格式
一个整数n(n<=24)。
输出格式
一个整数,能拼成的不同等式的数目。
输入输出样例
输入
14
输出
2
题解
#include<iostream>
using namespace std;
int m[1001] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}, t[4]; m[]初始化 0~9 需要的火柴 t[]存放运算 A + B=C
int num=0;
int n;
void dfs(int x)
{
int i;
for(i=0;i<=999;++i)
{
if(n-m[i]>=0)
{
t[x]=i;
n=n-m[i];
if(x==3)
{
if(t[1]+t[2]==t[3]&&n==0)
num++;
}
else
dfs(x+1);
n=n+m[i];
}
}
}
int main()
{
int i;
cin>>n;
n=n-4; 减去了加号和等号。
for(i=10;i<=999;++i)
m[i]=m[i/10]+m[i%10]; 这里把2位数和三位数 所需要的火柴数 通过0~9 来表示 。
dfs(1);
cout<<num;
return 0;
}
一道回溯题。


浙公网安备 33010602011771号