筛选法找素数
【题目描述】
用筛选法求n以内(含n,n<=1000)的素数,并逆序输出,每10个一行。
输入:n
输出:逆序输出n以内的素数,每10个一行,用空格隔开,行末无空格。
提示:筛选法,将1-n放入数组中,1不是素数,置为0;2是素数,保留,然后将后面2的倍数全部置为0;再下来的一个非0数3是素数,然后再将后面3的倍数置为0,…
【输入输出样例】
输入:
100
输出:
97 89 83 79 73 71 67 61 59 53
47 43 41 37 31 29 23 19 17 13
11 7 5 3 2
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
//n小于2,没有输出
if(n==0||n==1){
cout<<endl;
}
else{
int a[n+1]={0};
for(int i=2;i*i<n;i++){
for(int j=2;j*i<=n;j++){
a[j*i]=1;
}
}
int count=1;
for(int i=n;i>2;i--){
if(a[i]!=1){
if(count%10!=0){
cout<<i<<' ';
}
else if(count%10==0){
cout<<i<<endl;
}
count++;
}
}
cout<<'2';
}
}
选择排序
【题目描述】
输入n和n个整数,使用选择法排序,输出从大到小的序列。元素个数不超过100.
输入:正整数n和n个整数。
输出:从大到小的有序序列,用一个空格隔开,末尾无空格。
【输入输出样例】
输入:
4
1 2 3 4
输出:
4 3 2 1
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n]={0};
for (int i=0;i<n;i++){
cin>>a[i];
}
int min=a[0];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[j]<a[i]){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(int i=n-1;i>0;i--){
cout<<a[i]<<" ";
}
cout<<a[0];
}
输出杨辉三角
打印出以下的杨辉三角形 ,要求用户输入行数。
最大为20行
程序运行结果如下:
6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
(注:输出数据之间用一个空格分隔,每行最后没有空格,行之间不插入空行)
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n+1][n+1]={0};
a[0][0]=a[1][0]=a[1][1]=1;
for(int i=2;i<n;i++){
a[i][0]=a[i][i]=1;
for(int j=1;j<i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
if(a[i][j]!=0){
if(i!=j){
cout<<a[i][j]<<' ';
}
else if(i==j){
cout<<a[i][i];
}
}
}
cout<<endl;
}
}
矩阵鞍点
【题目描述】
编写程序,输入n和nn的整数矩阵元素,求其鞍点。n不超过10.
如果矩阵A中存在这样的一个元素A[i,j]满足条件:A[i,j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。
输入:矩阵阶数n, 然后按行输入nn个矩阵元素(空格分隔)。
输出:若干行,每行是矩阵的一个鞍点的行号、列号和数值,用一个空格隔开。若矩阵没有按点,输出"None"。输出的行号、列号从1开始。
【输入输出样例1】
输入:
3
1 7 3
5 4 6
17 18 9
输出:
3 3 9
【输入输出样例2】
输入:
3
5 19 20
6 20 9
19 18 5
输出:
None
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n > 10) {
return 0;
} else {
int a[n + 1][n + 1] = {0};
int r[n + 1] = {0};//r:每行最小值的列标
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
//遍历各行,找出各行最小值的列标
for (int k = 1; k <= n; k++) { //行数
r[k] = 1;
for (int i = 2; i <= n; i++) { //遍历每行 找最小值
if (a[k][i] < a[k][r[k]]) {
r[k] = i; //r[k]表示第k行的最小值的列标
}
}
}
//判断各行最小值是否为该列最大值
int lag = 0;
for (int j = 1; j <= n; j++) { //第j行最小值列标r[j]
int flag = 0;
for (int i = 1; i <= n; i++) { //行数
if (a[j][r[j]] < a[i][r[j]]) {
flag = 1; //flag=1时,该点就不是鞍点
break;
}
}
if (flag == 0) {
cout << j << ' ' << r[j] << ' ' << a[j][r[j]] << endl;
lag = 1;
}
}
if (lag == 0) {
cout << "None";
}
}
}
折半查找
【题目描述】
有n个数(n<20),已按从大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中的第几个元素的值(从1开始)。如果不在数组中输出0。
Input:
第一行为数组元素的个数n。
第二行是n个数组元素的值,整数。
第三行是要查找的值。
Output:
查找的值在数组中的位置(从序号1开始),找不到时显示0。
【输入输出样例】
输入:
10
10 9 8 7 6 5 4 3 2 1
5
输出:
6
#include <iostream>
using namespace std;
int pos(int *a, int l, int r, int x);
int main() {
int n, x;
cin >> n;
int a[n + 1] = {0};
for (int i = 0; i < n; i++) {
cin >> a[i];
}
cin >> x;
cout << pos(a, 0, n, x) << endl;
}
int pos(int *a, int l, int r, int x) {
if (r <= l) {
return 0;
} else if (r > l) {
int mid = (l + r) / 2;
if (x == a[mid] ) {
return mid + 1;
} else if (x > a[mid]) {
return pos(a, l, mid, x);
} else if (x < a[mid]) {
return pos(a, mid + 1, r, x);
}
}
}
字符串复制
题目内容:
编写程序,输入字符串(不含空格),保存在字符数组s2中,再将s2中的复制到字符数组s1中,输出s1。使用字符数组实现,不使用字符串库函数。字符串最大长度不超过100。
输入:字符串,一行,不带空格。
输出:字符串
注意:(1)不能使用已有的字符串复制函数(若使用已有库函数,记0分)。(2)本题的输入和输出是一样的,关键是有没有实现复制(投机取巧记0分)!!!
【提示】逐个赋值s2[i]给s1[i],直到遇到结束符。特别注意在s1末尾加结束符’\0’。
样例1输入:
copy
样例1输出:
copy
#include <iostream>
using namespace std;
int main() {
string a;
cin >> a;
char s1[100], s2[100];
for (int i = 0; i < a.length(); i++) {
s2[i] = a[i];
}
s2[a.length()] = '\0';
for (int i = 0; s2[i] != '\0'; i++) {
s1[i] = s2[i];
cout << s1[i];
}
}
计算矩阵的和
编写程序,输入矩阵的行数和列数,然后输入两个矩阵,计算并输出这两个矩阵的和。矩阵的行数和列数均不超过10.
输入:第1行,输入两个正整数,用一个或多个空格隔开,表示矩阵的行数和列数。
以下依次按行输入两个矩阵的元素,行中元素用一个或多个空格隔开。
输出,矩阵的和。按行排列,行中元素用一个空格隔开,末尾无空格。
输入输出样例
输入:
2 3
-9 -5 -4
-9 6 1
-8 1 4
-1 -7 -7
输出:
-17 -4 0
-10 -1 -6
#include <iostream>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
int a[m][n], b[m][n], sum[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> b[i][j];
sum[i][j] = a[i][j] + b[i][j];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (j == 0) {
cout << sum[i][j];
} else {
cout << ' ' << sum[i][j];
}
}
cout << '\n';
}
}
PS:以上代码仅在本校测试网站上AC,如有不足疏漏敬请谅解,且欢迎各位指正。