ACM程序设计-计算简单题.ppt

上传人:m**** 文档编号:571539480 上传时间:2024-08-11 格式:PPT 页数:26 大小:268.51KB
返回 下载 相关 举报
ACM程序设计-计算简单题.ppt_第1页
第1页 / 共26页
ACM程序设计-计算简单题.ppt_第2页
第2页 / 共26页
ACM程序设计-计算简单题.ppt_第3页
第3页 / 共26页
ACM程序设计-计算简单题.ppt_第4页
第4页 / 共26页
ACM程序设计-计算简单题.ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《ACM程序设计-计算简单题.ppt》由会员分享,可在线阅读,更多相关《ACM程序设计-计算简单题.ppt(26页珍藏版)》请在金锄头文库上搜索。

1、简单计算题简单计算题ACMACM程序设计程序设计列出完数列出完数n题目内容题目内容 自然数中,完数寥若晨星,请在从自然数中,完数寥若晨星,请在从1到某个整数范围到某个整数范围中打印出所有的完数来。所谓中打印出所有的完数来。所谓“完数完数”是指一个数是指一个数恰好等于它的所有不同因子之和。例如,恰好等于它的所有不同因子之和。例如,6是完数,是完数,因为因为6=1+2+3。而。而24不是完数,因为不是完数,因为 24 1+2+3+4+6+8+12(=36)。n输入描述输入描述 输入数据中含有一些整数输入数据中含有一些整数n(1n10000)2n输出描述输出描述 对于每个整数对于每个整数n,输出所有

2、不大于,输出所有不大于n的完数。每个整的完数。每个整数数n的输出由的输出由n引导,跟上冒号,然后是由空格开道引导,跟上冒号,然后是由空格开道的一个个完数,每个的一个个完数,每个n的完数列表应占独立的一行。的完数列表应占独立的一行。n输入样例输入样例 100 5000n输出样例输出样例 100: 6 28 5000: 6 28 4963题目分析题目分析n如果针对每个整数都搜索一次如果针对每个整数都搜索一次完数,时间会花费较多,由于完数,时间会花费较多,由于完数较少,可以先找出完数较少,可以先找出10000以内的所有完数,然后再针对以内的所有完数,然后再针对n查表。查表。4参考源代码参考源代码#i

3、ncludeintmain(void)inti,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;5参考源代码参考源代码while(scanf(%d,&n)=1)printf(%d:,n);for(i=0;ik;i+)if(ai=n)printf(%d,ai);printf(n);return0;6对称三位数素数对称三位数素数n题目内容题目内容 判断一个数是否为对称三位数素数。所谓判断一个数是否为对称三位数素数。所谓“对称对称”是指一

4、个数,倒过来还是该数。例如,是指一个数,倒过来还是该数。例如,375不是对称不是对称数,因为倒过来变成了数,因为倒过来变成了573。n输入描述输入描述 输入数据含有不多于输入数据含有不多于50个的正整数个的正整数(0n232)。n输出描述输出描述 对于每个对于每个n,如果该数是对称三位数素数,则输出,如果该数是对称三位数素数,则输出“Yes”,否则输出,否则输出“No”。每个判断结果单独一行。每个判断结果单独一行。7n输入样例输入样例 11 101 272n输出样例输出样例 No Yes No8题目分析题目分析n三位对称只须判断个数与百位三位对称只须判断个数与百位是否相等。是否相等。9参考源代

5、码参考源代码#include#includeintisprime(inta)inti;ints=(int)sqrt(double)a);for(i=2;i100&n1000&n/100=n%10&isprime(n)?Yesn:Non);return0;11五位以内的对称素数五位以内的对称素数n题目内容题目内容 判断一个数是否为对称且不大于五位数的素数。判断一个数是否为对称且不大于五位数的素数。n输入描述输入描述 输入数据含有不多于输入数据含有不多于50个的正整数个的正整数n(0n232)。n输出描述输出描述 对于每个对于每个n,如果该数是不大于五位数的对称素数,如果该数是不大于五位数的对称素

6、数,则输出则输出“Yes”,否则输出,否则输出“No”。每个判断结果单。每个判断结果单独列一行。独列一行。12n输入样例输入样例 11 101 272n输出样例输出样例 Yes Yes No13题目分析题目分析n怎样判断每位对称素数?怎样判断每位对称素数?14参考源代码参考源代码#includeintisprime(intn)inti;if(n=1)/1不是素数不是素数return0;if(n!=2&n%2=0)/除开除开2以外的偶数以外的偶数return0;for(i=3;i*i=n;i+=2)/恰好跳过恰好跳过2,3,5,7,它们是素数,它们是素数if(n%i=0)return0;retu

7、rn1;15参考源代码参考源代码int issym(int n)if(n100&n10000&n/1000=n%10*10+n/10%10)return 1;return 0;16参考源代码参考源代码intmain(void)intn;while(scanf(%d,&n)=1)printf(%sn,n100000&issym(n)&isprime(n)?Yes:No);return0;17AneasyproblemnTimeLimit:6000/3000MS(Java/Others)nMemoryLimit:32768/32768K(Java/Others)18nProblem Descrip

8、tion 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

9、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 ?19nInput T

10、he first line contain a T(T = 2000) . followed by T lines ,each line contain an integer N (0=N = ).nOutput For each case, output the number of ways in one line. 20nSample input: 2 1 3 Sample output: 0 121题目分析:题目分析:n思路思路1 1: 将等式变形为将等式变形为 N + 1 = (i + 1) * (j + 1),由于由于i = j,只需要枚举,只需要枚举i (枚举范围从(枚举范围从1到

11、到 ),然后判断是否满足,直接计数),然后判断是否满足,直接计数即可。即可。22n思路思路2 2: 同样将等式变形同样将等式变形N + 1 = (i + 1) * (j + 1)。只。只需要求出需要求出N + 1的约数个数,然后分情况处理即的约数个数,然后分情况处理即可。令可。令N + 1的约数个数为的约数个数为fN + 1 n1. 当当N + 1为完全平方数时,为完全平方数时,ans = (fN + 1 2 + 1) / 2n公式可以理解成:所有的约数,去掉公式可以理解成:所有的约数,去掉1和本身和本身之后(减之后(减2),剩下的可以对称的组成一对一),剩下的可以对称的组成一对一对的答案。对

12、的答案。23而分解质因数最有效的方法就是而分解质因数最有效的方法就是筛出筛出 范围内的范围内的素数表,然后依次试除。素数表,然后依次试除。2. 当当N +非完全平方数,同理可得,非完全平方数,同理可得, ans = (fN + 1 2) / 2 。如何快速的求一个数如何快速的求一个数N的约数个数的约数个数 我们知道我们知道,任何一个自然数任何一个自然数N可以表示成其质因数可以表示成其质因数的幂的乘积的形式的幂的乘积的形式.由排列组合的乘法原理知,由排列组合的乘法原理知,N的约数个数的约数个数 fN = (a1 + 1) * (a2 + 1)*(an + 1)241、简单的筛素数、简单的筛素数n

13、其思想是,先假定所有的数都是素数,其思想是,先假定所有的数都是素数,然后从然后从2开始依次筛掉素数的倍数的数。开始依次筛掉素数的倍数的数。25const int Max = 100000;bool bpMax + 1; /记录每个数是否是素数记录每个数是否是素数int p30000; /记录筛选出来的素数记录筛选出来的素数int pCnt=0; /记录当前筛选出来的素数个数记录当前筛选出来的素数个数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;26

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号