【c++笔试强训】(第四十六篇)

目录

 

数位染⾊(动态规划-01背包)

题目解析

讲解算法代码

编写代码

素数回⽂(模拟+数学)

题目解析

讲解算法代码

编写代码


 

数位染⾊(动态规划-01背包)

题目解析

1.题目链接:数位染色_牛客题霸_牛客网

2.题目描述

描述

小红拿到了一个正整数 x\x  。她可以将其中一些数位染成红色。然后她想让所有染红的数位数字之和等于没染色的数位数字之和。
她不知道能不能达成目标。你能告诉她吗?

输入描述:

一个正整数 x\x  ,1 \leq x \leq 10^{18}1≤x≤1018
 

输出描述:

如果小红能按要求完成染色,输出"Yes"。否则输出"No"。

示例1

输入:

1234567

输出:

Yes

说明:

将3、4、7染成红色即可,这样3+4+7=1+2+5+6

示例2

输入:

23

输出:

No

说明:

显然无论如何都不能完成染色。

讲解算法原理

解法:
算法思路:

01背包应⽤题~

编写代码

c++算法代码:

#include <iostream>
using namespace std;
const int N = 20, M = N * 9;
long long x;int n, sum; // 这个数有多少位int arr[N];bool dp[M];
bool fun()
{
 if(sum % 2 == 1) return false; sum /= 2; dp[0] = true; for(int i = 0; i < n; i++) { for(int j = sum; j >= arr[i]; j--) { dp[j] = dp[j] || dp[j - arr[i]]; }
 }
 return dp[sum];
}
int main()
{
 cin >> x;
 while(x)
 {
 arr[n++] = x % 10; sum += x % 10; x /= 10;
 }
 if(fun()) cout << "Yes" << endl; else cout << "No" << endl;
 return 0;
}

java算法代码:

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
 public static void main(String[] args) 
 {
 Scanner in = new Scanner(System.in); long x = in.nextLong(); int[] arr = new int[20]; int n = 0, sum = 0; while(x != 0)
 {
 int t = (int)(x % 10); arr[n++] = t; sum += t; x /= 10;
 }
 if(sum % 2 == 1)
 {
 System.out.println("No");
 }
 else
 {
 sum /= 2; boolean[] dp = new boolean[sum + 1]; dp[0] = true; for(int i = 0; i < n; i++) { for(int j = sum; j >= arr[i]; j--) { dp[j] = dp[j] || dp[j - arr[i]]; } } if(dp[sum]) System.out.println("Yes"); else System.out.println("No"); }
 }
}

素数回⽂(模拟+数学)

题目解析

1.题目链接:素数回文_牛客题霸_牛客网

2.题目描述

描述

现在给出一个素数,这个素数满足两点:

1、  只由1-9组成,并且每个数只出现一次,如13,23,1289。

2、  位数从高到低为递减或递增,如2459,87631。

请你判断一下,这个素数的回文数是否为素数(13的回文数是131,127的回文数是12721)。

输入描述:

输入只有1行。

第1行输入一个整数t,保证t为素数。

数据保证:9<t<109

输出描述:

输出一行字符串,如果t的回文数仍是素数,则输出“prime”,否则输出"noprime"。

示例1

输入:

13

输出:

prime

说明:

13的回文数是131,131是素数

示例2

输入:

17

输出:

noprime

说明:

17的回文数是171,171不是素数(因子有3)

讲解算法原理

解法:
算法思路:

模拟题,注意数据范围~

编写代码

c++算法代码:

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
long long change(string s)
{
 for(int i = s.size() - 2; i >= 0; i--)
 {
 s += s[i];
 }
 return stol(s);
}
bool isprim(long long x)
{
 if(x <= 1) return false; for(long long i = 2; i <= sqrt(x); i++) { if(x % i == 0) return false; } return true;
}
int main()
{
 string s;
 cin >> s;
 long long x = change(s); if(isprim(x)) cout << "prime" << endl; else cout << "noprime" << endl;
 return 0;
}

java算法代码:

mport java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
 public static long change(String s)
 {
 StringBuffer tmp = new StringBuffer(s); for(int i = s.length() - 2; i >= 0; i--) { tmp.append(s.charAt(i));
 }
 return Long.parseLong(tmp.toString());
 }
 public static boolean isprim(long x)
 {
 if(x <= 1) return false; for(long i = 2; i <= Math.sqrt(x); i++) { if(x % i == 0) return false; } return true;
 }
 public static void main(String[] args) 
 {
 Scanner in = new Scanner(System.in); String s = in.next(); long x = change(s); if(isprim(x)) System.out.println("prime"); else System.out.println("noprime"); }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值