吸血鬼素数 C/C++
吸血鬼素数
1994年,美国数学家皮科夫在一篇文章中首次提出了吸血鬼数。如果一个2n(n是自然数)位的自然数等于自己各个数字任意组成的两个n位数的乘积,那么这个自然数就叫吸血鬼数。其中这两个n位数都被称为獠牙或尖牙。比如1260=21×60,所以1260是一个吸血鬼数。注意两个尖牙的个位数不能同时为0,例如虽然126000=210×600,但126000却不是吸血鬼数。在此基础上,2002年,数学家里维拉定义了吸血鬼素数。如果吸血鬼数的两个尖牙都是素数,则这两个尖牙都叫吸血鬼素数。例如,117067=167×701,而167和701都是素数,所以167和701都是3位吸血鬼素数。
输入一个正整数n(小于1000),请判断它是否吸血鬼素数。如果是,打印YES,否则打印NO。
输入格式:
一个小于1000的正整数n
输出格式:
YES或者NO
输入样例:
701
输出样例:
YES
思路:
训练的时候遇到了这题,因为这题的输出只有"YES"和"NO",我直接无脑输出"YES"骗了一点分。_(:з」∠)_
正常的解法是:
设:i = n*m ,i是吸血鬼数,n是输入的数
先判断n是不是素数,如果不是素数就不可能是吸血鬼素数,直接输出"NO",结束程序。
如果是素数,则算出n的位数h,根据h得出吸血鬼数i的位数为2h,范围为102h-1 <= i < 102h,如:n = 701,h = 3,2h = 6,105 <= i < 106,100000 <= i < 1000000。
求出m当且仅当i%n == 0。求出的m也应该是吸血鬼素数,所以还要判断m的位数是否也是h,m是否也是素数。
因为吸血鬼数i等于自己各个数字任意组成的两个n位数的乘积,所以i各个数字出现的次数等于n和m各个数字出现的次数之和。
可以建立两个数组(变量名称是个人习惯)int is[10],nm[10];全部元素初始化为0,分别用来记录i各个数字出现的次数和n和m各个数字出现的次数之和,如果完全相同,就说明n和m是吸血鬼素数。
如果i一直到102h都没找到对应的m,则n不是吸血鬼素数。
代码
#include<bits/stdc++.h>
using namespace std;int ss(int x); //判断是不是素数
int weishu(int x); //计算有多少位 int main(void)
{int n,m;int nm[10],is[10];int h,max_h;int i,j;int z;scanf("%d",&n);if(ss(n) == 1){h = weishu(n);max_h = (int)pow(10,2*h);
// printf("h = %d\n",h);
// printf("i = %d\n",(int)pow(10,2*h-1));
// printf("max_h = %d\n",max_h);for(i = (int)pow(10,2*h-1);i < max_h;i++){if(i%n == 0){m = i/n;if(weishu(m) == h && ss(m) == 1){ //位数相同,都是素数 //printf("%d %d %d\n",i,n,m);for(j = 0;j < 10;j++){nm[j] = 0;is[j] = 0;}while(m > 0){nm[m%10]++;m /= 10;}m = n;while(m > 0){nm[m%10]++;m /= 10;}m = i;while(m > 0){is[m%10]++;m /= 10;}z = 1;for(j = 0;j < 10;j++){if(nm[j] != is[j]){z = 0;break;}}if(z == 1){printf("YES");break;}}}}if(z == 0){printf("NO");}}else {printf("NO");}return 0;
}int ss(int x){int z = 1;int i;if(x == 2){z = 1;}else if(x > 2){if(x%2 == 0){z = 0;}for(i = 3;i <= sqrt(x) && z == 1;i += 2){if(x%i == 0){z = 0;break;}}}else {z = 0;}return z;
}int weishu(int x){int z = 0;if(x != 0){while(x != 0){z++;x /= 10;}}else {z = 1;}return z;
}
吸血鬼素数 C/C++相关推荐
- PTA 7-178 吸血鬼素数
PTA 7-178 吸血鬼素数 分数 10 作者 林生佑 单位 浙江传媒学院 1994年,美国数学家皮科夫在一篇文章中首次提出了吸血鬼数.如果一个2n(n是自然数)位的自然数等于自己各个数字任意组成的 ...
- 7-57 吸血鬼素数测试增强版 (15 分)
7-57 吸血鬼素数测试增强版 (15 分) 吸血鬼素数是指这样的数:如果两个相同位数的素数,其乘积的组成数字正好与这两个素数的组成数字相同,那么这两个素数都被称为吸血鬼素数,例如,117067=16 ...
- java 4位数,java 找出4位数的所有吸血鬼数字
java 找出4位数的所有吸血鬼数字 /** * 找出四位数所有的吸血鬼数字 * 吸血鬼数字:位数为偶数的数字可以由一对数字相乘而得,这对数字包含乘积一半的位数 * 如:1260 = 21*60 */ ...
- Java实现吸血鬼数字
题目描述:找出所有四位数的吸血鬼数字. 实验思路: 首先从吸血鬼数字本身考虑,则从1000遍历到9999.这需要找出每一个数字的是否存在对应的一对因子使之满足吸血鬼数字的条件,此方法工作量大且算法难以 ...
- 关于素数的简单算法整理
1.梅森尼数 import java.util.ArrayList;public class text6 {/*** 梅森尼数(2的N次方减一是素数,N也必须是素数)*/private static ...
- n个素数构成等差数列
n个素数构成等差数列 Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld Description 有n个素数(均小于m)可以 ...
- 找出前50个素数,构成素数表
import java.util.Scanner;public class Hello {private static Scanner in;public static void main(Strin ...
- 数论(一)——素数,GCD,LCM
这是一个数论系列:) 一.素数 ×费马小定理 Theorem: 设 p 是一个素数,a 是一个整数且不是 p 的倍数,那么 很遗憾,费马小定理的逆定理是不成立的.对 a = 2,满足的非素数 n 是存 ...
- openoj的一个小比赛(F题解题报告)poj3978(dp+素数筛选)
http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=47#problem/F 一个素数帅选法的题目,才开始直接就套模板结构tle ...
最新文章
- 用Windows Media Player截图的方法
- java高并发(二)并发与高并发基本概念
- 这6部超经典的物理电影,居然还有人没有看过?
- CNN分类,ResNet V1 ,ResNet V2,ResNeXt,DenseNet
- 推荐12个漂亮的 CSS3 按钮实现方案
- 华为鸿蒙应用市场抽成,谷歌宣布抽成30%,开发者把华为鸿蒙看做是取代安卓的唯一救星...
- honeywell新风系统控制面板说明_详解装了新风系统,怎么清洗维护简单?
- 容器技术Docker K8s 11 容器服务Kubernetes版ACK详解-集群查看及管理
- PMP考试有哪些技巧?(技巧+资料分享)
- 如何获取ppt的背景图片
- linux文件解压与压缩命令
- “槑囧圐圙”您认得这些汉字吗?
- Python 之心有猛虎,细嗅蔷薇
- 设计并制造一台简单的光电仪器需要什么知识
- Mac下的常用快捷键操作
- 《咏怀古迹五首·其三》.唐.杜甫
- VLDB 2021 COCO 论文阅读
- 8255A的工作方式
- 微服务架构下的软件测试实践
- php tp5上传图片到阿里云OSS
热门文章
- 【苹果推相册软件】imessage群发arrangesAllSubviews安装
- 无验证码不扫码拼多多微信批量登陆思路
- 【解决方案】雷电模拟器去开屏广告
- Android互动直播APP开发入门笔记,吐血整理
- 【Android每周专题】触摸屏手势
- 力扣(LeetCode)个人主页draw()方法怎么画出好看图案? // 使用函数 draw 绘制图形,反斜杠 “\“ 请使用 “\\“ 转义
- 用AI取代SGD?无需训练ResNet-50,AI秒级预测全部2400万个参数,准确率60% | NeurIPS 2021...
- 小技巧:如何创建公共邮箱?教育邮箱创建哪个好?
- C1见习工程师(二)
- Parallels Desktop 15.1.4 直装版 — 苹果电脑虚拟机