【c++】程序设计第四周作业

筛选法找素数

【题目描述】
用筛选法求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, 然后按行输入n
n个矩阵元素(空格分隔)。
输出:若干行,每行是矩阵的一个鞍点的行号、列号和数值,用一个空格隔开。若矩阵没有按点,输出"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,如有不足疏漏敬请谅解,且欢迎各位指正。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值