第四周简单题三

上传人:dja****22 文档编号:242999927 上传时间:2024-09-13 格式:PPT 页数:30 大小:118.50KB
返回 下载 相关 举报
第四周简单题三_第1页
第1页 / 共30页
第四周简单题三_第2页
第2页 / 共30页
第四周简单题三_第3页
第3页 / 共30页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第四讲,关于数的一些简单问题,ACM算法与程序设计,9/13/2024,1,列出完数,题目内容,自然数中,完数寥若晨星,请在从1到某个整数范围中打印出所有的完数来。所谓“完数”是指一个数恰好等于它的所有不同因子之和。例如,6是完数,因为6=1+2+3。而24不是完数,因为,24 1+2+3+4+6+8+12(=36)。,输入描述,输入数据中含有一些整数n(1n10000),9/13/2024,2,输出描述,对于每个整数n,输出所有不大于n的完数。每个整数n的输出由n引导,跟上冒号,然后是由空格开道的一个个完数,每个n的完数列表应占独立的一行。,输入样例,100,5000,输出样例,100: 6 28,5000: 6 28 496,9/13/2024,3,题目分析,如果针对每个整数都搜索一次完数,时间会花费较多,由于完数较少,可以先找出10000以内的所有完数,然后再针对n查表。,9/13/2024,4,参考源代码,#include ,int main(void),int i,j,k=0,n,sum,a100;,for(i=2;i10000;i+=2) /,完数一定为偶数,sum=1;,for(j=2;j=i/2;j+),if(i%j=0),sum+=j;,if(sum=i),ak+=i;,9/13/2024,5,参考源代码,while(scanf(%d,&n)=1),printf(%d: ,n);,for(i=0;ik;i+),if(ai=n),printf(%d ,ai);,printf(n);,return 0;,9/13/2024,6,对称三位数素数,题目内容,判断一个数是否为对称三位数素数。所谓“对称”是指一个数,倒过来还是该数。例如,375不是对称数,因为倒过来变成了573。,输入描述,输入数据含有不多于50个的正整数(0n232)。,输出描述,对于每个n,如果该数是对称三位数素数,则输出“Yes”,否则输出“No”。每个判断结果单独一行。,9/13/2024,7,输入样例,11 101 272,输出样例,No,Yes,No,9/13/2024,8,题目分析,三位对称只须判断个数与百位是否相等。,9/13/2024,9,参考源代码,#include ,#include ,int isprime(int a),int i;,int s=(int)sqrt(double)a);,for(i=2;i100&n1000,&n/100=n%10,&isprime(n),?Yesn:Non);,return 0;,9/13/2024,11,五位以内的对称素数,题目内容,判断一个数是否为对称且不大于五位数的素数。,输入描述,输入数据含有不多于50个的正整数n(0n232)。,输出描述,对于每个n,如果该数是不大于五位数的对称素数,则输出“Yes”,否则输出“No”。每个判断结果单独列一行。,9/13/2024,12,输入样例,11 101 272,输出样例,Yes,Yes,No,9/13/2024,13,题目分析,怎样判断每位对称素数?,9/13/2024,14,参考源代码,#include ,int isprime(int n),int i;,if(n=1) /1不是素数,return 0;,if(n!=2&n%2=0)/除开2以外的2偶数,return 0;,for(i=3;i*i=n;i+=2)/恰好跳过2,3,5,7,它们是素数,if(n%i=0),return 0;,return 1;,9/13/2024,15,参考源代码,int issym(int n),if(n100&n10000&n/1000=n%10*10+n/10%10),return 1;,return 0;,9/13/2024,16,参考源代码,int main(void),int n;,while(scanf(%d,&n)=1),printf(%sn,n100000&issym(n),return 0;,9/13/2024,17,An easy problem,Time Limit: 6000/3000 MS (Java/Others),Memory Limit: 32768/32768 K (Java/Others),9/13/2024,18,Problem Description,When Teddy was a child , he was always thinking about some simple math problems ,such as “What its 1 cup of water plus 1 pile of dough .” , “100 yuan buy 100 pig” .etc.,One day Teddy met a old man in his dream , in that dream the man whose name was“RuLai” gave Teddy a problem :Given an N , can you calculate how many ways to write N as i * j + i + j (0 i = j) ?Teddy found the answer when N was less than 10but if N get bigger , he found it was too difficult for him to solve.Well , you clever ACMers ,could you help little Teddy to solve this problem and let him have a good dream ?,9/13/2024,19,Input,The first line contain a T(T = 2000) . followed by T lines ,each line contain an integer N (0=N = ).,Output,For each case, output the number of ways in one line.,9/13/2024,20,Sample input:,2,1,3,Sample output:,0,1,9/13/2024,21,题目分析:,思路1:,将等式变形为 N + 1 = (i + 1) * (j + 1),由于i = j,只需要枚举i (枚举范围从1到 ),然后判断是否满足,直接计数即可。,9/13/2024,22,思路2:,同样将等式变形N + 1 = (i + 1) * (j + 1)。只需要求出N + 1的约数个数,然后分情况处理即可。令N + 1的约数个数为fN + 1,1. 当N + 1为完全平方数时,ans = (fN + 1 2 + 1) / 2,公式可以理解成:所有的约数,去掉1和本身之后(减2),剩下的可以对称的组成一对一对的答案。,9/13/2024,23,而分解质因数最有效的方法就是筛出 范围内的素数表,然后依次试除。,2. 当N +非完全平方数,同理可得,,ans = (fN + 1 2) / 2 。,如何快速的求一个数N的约数个数,我们知道,任何一个自然数N可以表示成其质因数的幂的乘积的形式.,由排列组合的乘法原理知,N的约数个数,fN = (a1 + 1) * (a2 + 1)*(an + 1),9/13/2024,24,1、简单的筛素数,其思想是,先假定所有的数都是质数,然后从2开始依次筛掉素数的倍数的数。,9/13/2024,25,const int Max = 100;,bool bpMax + 1; /记录每个数是否是素数,int p30; /记录筛选出来的素数,int pCnt; /记录当前筛选出来的素数个数,void sievePrime(),int i, j;,memset(bp, true, sizeof(bp);,bp0 = bp1 = false;,for (i = 2; i = Max; i+),if (bpi) /i是素数,ppCnt+ = i;,for (j = i * i; j = Max; j += i) /依次筛掉i的倍数,bpj = false;,9/13/2024,26,2、线性筛素数,线性筛素数算法能够保证每个合数被且仅被其最小素因子筛掉一次。,综观整个线性筛素数的代码,和普通筛素数的方法比,只是筛的顺序变了。,9/13/2024,27,const int Max = 100;,bool bpMax + 1; /记录每个数是否是素数,int p30; /记录筛选出来的素数,int pCnt; /记录当前筛选出来的素数个数,void sievePrime(),int i, j;,memset(bp, true, sizeof(bp);,bp0 = bp1 = false;,for (i = 2; i = Max; i+),if (bpi) ppCnt+ = i;,for (j = 0; j pCnt j+),bpi * pj = false;,if (i % pj = 0) break;,9/13/2024,28,课后练习:,Number Sequence,链接地址:,Problem Description,A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2) mod 7.Given A, B, and n, you are to calculate the value of f(n).,Input,The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 = A, B = 1000, 1 = n = 100,000,000). Three zeros signal the end of input and this test case is not to be processed.,Output,For each test case, print the value of f(n) on a single line.,9/13/2024,29,题目特点:,这个题目是一个比较典型的ACM竞赛题,尽管在真正的大赛中这个题目可能算比较简单的,但在省级比赛中,本题难度属于中等,可以说,能做出本题的队伍基本都有二等奖以上。,但如果不认真分析,有可能会掉入陷阱。,9/13/2024,30,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!