1.质因数分解描述已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。
格式输入格式输入只有一行包含一个正整数n。
输出格式输出只有一行包含一个正整数p, 即较大的那个质数。
样例1样例输入121样例输出17限制1S提示【数据范围】对于60%的数据,6 ≤n ≤1000。
对于100%的数据,6 ≤n ≤2*10的9次方问题分析:如果一个数n是两个素数的乘积,那么其中一个素数必然小于或等于n的开平方。
AC的C++程序如下:1.#include <iostream>2.#include <cmath>3.ing namespace std;5.6.int main()7.{8.long n;9.10. cin >> n;11.12.if(n % 2 == 0)13. cout << n / 2 << endl;14.else {15.int start = sqrt(n) / 2;16. start = start * 2 + 1;17.18.for(int i=start; i>=3; i-=2) {19.if(n % i == 0) {20. cout << n / i << endl;21. }22. }23. }24.25.return 0;26.}2.级数求和问题分析:简单的求和比较问题。
程序说明:需要注意类型。
描述已知:Sn= 1+1/2+1/3+…+1/n。
显然对于任意一个整数K,当n足够大的时候,Sn大于K。
现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。
格式输入格式输入k输出格式输出n样例1样例输入11样例输出12限制每个测试点1sAC的C++程序如下:1.#include <iostream>2.ing namespace std;4.5.int main()6.{7.int k;8.long n = 0;9.double sum = 0;10.11. cin >> k;12.while(sum <= k) {13. n++;14. sum += 1 / (double) n;15. }16.17. cout << n << endl;18.19.return 0;20.}3. 奖学金描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。
期末,每个学生都有3门课的成绩:语文、数学、英语。
先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。
注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。
例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:7 2795 279这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。
这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。
如果你的前两名的输出数据是:5 2797 279则按输出错误处理,不能得分。
格式输入格式输入包含n+1行:第l行为一个正整数n,表示该校参加评选的学生人数。
第2到年n+l行,每行有3个用空格隔开的数字,每个数字都在0到100之间。
第j 行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。
每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
输出格式输出共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
样例1样例输入1690 67 8087 66 9178 89 9188 99 7767 89 6478 89 98样例输出16 2654 2643 2582 2441 237样例2样例输入2880 89 8988 98 7890 67 8087 66 9178 89 9188 99 7767 89 6478 89 98样例输出28 2652 2646 2641 2585 258限制各个测试点1s提示50%的数据满足:各学生的总成绩各不相同100%的数据满足:6<=n<=300问题分析:这是一个排序问题,排序后输出结果。
1.#include <iostream>2.#include <algorithm>3.ing namespace std;5.6.const int N = 300;7.const int N2 = 5;8.9.struct _student {10.int no;11.int yuwen;12.int total;13.} s[N];14.15.int cmp(const _student &a, const _student &b)16.{17.if(a.total != b.total)18.return a.total > b.total;19.if(a.yuwen != b.yuwen)20.return a.yuwen > b.yuwen;21.else22.return a.no < b.no;23.}24.25.int main()26.{27.int n, a, b;28.29. cin >> n;30.for(int i=0; i<n; i++) {31. cin >> s[i].yuwen >> a >> b;32. s[i].no = i + 1;33. s[i].total = s[i].yuwen + a + b;34. }35.36. sort(s, s + n, cmp);37.38.for(int i=0; i<N2; i++)39. cout << s[i].no << " " << s[i].total << endl;40.41.return 0;42.}4.扫雷游戏描述扫雷游戏是一款十分经典的单击小游戏。
在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。
玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。
游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、左下、右上、右下八个方向上与之直接相邻的格子。
格式输入格式第一行用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。
接下来n行,每行m个字符,描述了雷区中的地雷分布情况。
字符‘’*‘’表示相应的格子是地雷格,字符‘?’表示相应的格子是非地雷格子。
相邻字符之间无分隔符。
输出格式输出文件包括n行,每行m个字符,描述了整个雷区。
用‘’*‘’表示地雷格,用周围地雷格数表示非地雷格。
相邻字符之间无分隔符。
样例1样例输入13 3*??*样例输出1*102211*1样例2样例输入22 3**??样例输出22*1*21限制对于所有的数据,1≤n≤100, 1≤m≤100。
问题分析:扫雷游戏是人们熟知的一个计算机游戏,通过这个程序,可以了解其局部的计算是如何实现的。
这是一个简单的计算问题,对于一个位置,直接计算其周围的地雷数量即可。
定义二维数组用于存储扫雷游戏的棋盘时,周围多出一圈,可以省去数组下标的越界判定。
程序说明:函数memset()用于给大量的存储空间设置初始值是方便快捷的。
数组around[]存储周围元素的相对下标,使得无序变有序,可以用循环来处理。
AC的C++程序如下:#include<stdio.h>#include<string.h>struct _around {int drow;int dcol;} around[] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};#define AN 8#define N 100char a[N+2][N+2];int main(){int n, m, i, j, k;memset(a, 0, sizeof(a));scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%s",a[i]+1);for(i=1;i<=n;i++){for(j=1;j<=m;j++){int count=0;if(a[i][j]=='*')printf("%c",a[i][j]);else{for(k=0;k<AN;k++)if(a[i+around[k].drow][j+around[k].dcol]=='*')count++;printf("%d",count);}}printf("\n");}return 0;}。