[Swust OJ 610]--吉祥数
2015-06-17 20:44
681 查看
题目链接:http://acm.swust.edu.cn/problem/610/
Time limit(ms): 1000 Memory limit(kb): 65535
Description
马上就是新年了,在这里提前祝大家新年快乐,首先送大家一个吉祥数——1898。相信意思大家都明白吧,接着就请大家根据下面的提示来找出一些和我们这个吉祥数相关的一些数吧。
请将不大于2008的所有素数从小到大排成第一行,第二行上的每个数都等于它头上的素数与它右肩上的素数之差。编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假好存在的话,又有几种这样的情况?例如:
第一行:2 3 5 7 11 13 17......1979 1987 1993
第二行:1 2 2 4 2 4...... 8 6
Input
没有输入
Output
输出有多个结果,输出所有满足条件的结果,要求只输出每个结果对应第1行数的起始数和终止数,两个数间空两格,每个结果间换行,所有的结果按起始数从大到小的顺序输出,具体见Sample
Sample Input
Sample Output
解题思路:(1)假设第一行中的素数为n[1]、n[2]、n[3]....n、...第二行中的差值为m[1]、m[2]、m[3]...m[j]...。其中m[j]为:m[j]=n[j+1]-n[j]。
(2)则第二行连续N个数的和为:
SUM=m[1]+m[2]+m[3]+...+m[j]
=(n[2]-n[1])+(n[3]-n[2])+(n[4]-n[3])+...+(n[j+1]-n[j])
=n[j+1]-n[1]
由此题目就变成了:在不超过2008的所有素数中是否存在这样两个素数,它们的差恰好是1898。若存在,则第二行中必有所需整数序列,其和恰为1898,。
对等价问题的求解是比较简单的。
由分析可知,在素数序列中不必包含2,因为任意素数与2的差一定为奇数,所以不必考虑。(同样素数由素数表打表得到)
代码如下:
View Code
Time limit(ms): 1000 Memory limit(kb): 65535
Description
马上就是新年了,在这里提前祝大家新年快乐,首先送大家一个吉祥数——1898。相信意思大家都明白吧,接着就请大家根据下面的提示来找出一些和我们这个吉祥数相关的一些数吧。
请将不大于2008的所有素数从小到大排成第一行,第二行上的每个数都等于它头上的素数与它右肩上的素数之差。编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假好存在的话,又有几种这样的情况?例如:
第一行:2 3 5 7 11 13 17......1979 1987 1993
第二行:1 2 2 4 2 4...... 8 6
Input
没有输入
Output
输出有多个结果,输出所有满足条件的结果,要求只输出每个结果对应第1行数的起始数和终止数,两个数间空两格,每个结果间换行,所有的结果按起始数从大到小的顺序输出,具体见Sample
Sample Input
无输入 |
101 1999 89 1987 …… …… …… |
(2)则第二行连续N个数的和为:
SUM=m[1]+m[2]+m[3]+...+m[j]
=(n[2]-n[1])+(n[3]-n[2])+(n[4]-n[3])+...+(n[j+1]-n[j])
=n[j+1]-n[1]
由此题目就变成了:在不超过2008的所有素数中是否存在这样两个素数,它们的差恰好是1898。若存在,则第二行中必有所需整数序列,其和恰为1898,。
对等价问题的求解是比较简单的。
由分析可知,在素数序列中不必包含2,因为任意素数与2的差一定为奇数,所以不必考虑。(同样素数由素数表打表得到)
代码如下:
#include <iostream> #include <cstring> using namespace std; int ptr[520], prime[2015] = { 0, 0, 1 }; void init(){ int i, j; memset(prime, 1, sizeof(prime)); for (i = 2; i <= 2008; i++){ if (prime[i]){ for (j = 2; i*j <= 2008; j++) prime[i*j] = 0; } } } int main(){ int i, j; init(); for (j = 0, i = 3; i <= 2008; i += 2) if (prime[i]) ptr[j++] = i; for (j--; ptr[j] > 1898; j--){ for (i = 0; ptr[j] - ptr[i] > 1898; i++); if (ptr[j] - ptr[i] == 1898) cout << ptr[i] << " " << ptr[j] << endl; } return 0; }
View Code
相关文章推荐
- oj刷题第一批E 对象数组求最大值
- 【hadoop】ssh localhost 免密码登陆(图解)
- shell中if语句特殊参数
- 第十四周项目2-用文件保存的学生名单
- VC中使用纯资源dll实现多语言版本
- hive中sql解析出对应表和字段的调查
- WorldWind源码剖析系列:可渲染对象类RenderableObject
- Android 学习笔记之如何实现简单相机功能
- struts的国际化理解
- 1029. Median (25)
- bzoj1005 [HNOI2008]明明的烦恼
- shell与export命令
- 第十四周项目1-小玩文件
- 第15周-阅读项目2-异常处理&&命名空间
- 每天一个linux命令(39):grep 命令
- android的数据存储方式---5种方法
- 软件工程理论阅读笔记3
- 软件工程理论阅读笔记2
- [BZOJ 1789 & 1830] [AHOI 2008] Necklace Y型项链
- WorldWind源码剖析系列:窗口定制控件类WorldWindow