洛谷打卡 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;
     
 }

一道回溯题。

posted @ 2020-04-14 16:38  猫与小岛  阅读(202)  评论(0)    收藏  举报