7-51 求n以内最大的k个素数以及它们的和 (20 分)

本题要求计算并输出不超过n的最大的k个素数以及它们的和。

输入格式:
输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。

输出格式:
在一行中按下列格式输出:

素数1+素数2+…+素数k=总和值
其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。

输入样例1:

1000 10

输出样例1:

997+991+983+977+971+967+953+947+941+937=9664

输入样例2:

12 6

输出样例2:

11+7+5+3+2=28
#include <stdio.h>
int main() {
    int sam(int p);
    int n, k, count = 0, sum = 0, i;
    scanf("%d %d", &n, &k);
    for(i = n-1; i > 1; i--) {
        if(sam(i)) {
            count++;
            if(count == 1) {
                printf("%d", i);
            }else {
                printf("+%d", i);
            }
            sum = sum+i;
        }
        if(count == k) break;
    }
    printf("=%d", sum);
    return 0;
}
int sam(int p) {
    int i;
    if(p == 1) return 0;
    for(i = 2; i <= p/2; i++) {
        if(p%i == 0) {
            return 0;
        }
    }
    return 1;
}

7-52 数组元素循环右移问题 (20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4
#include <stdio.h>
int main()
{
	int n,m,i;
	scanf("%d %d",&n,&m);
	if(n<=100&&n>=1){
		int sam[n];
		for(i=0;i<n;i++){
			m=m%n;
			scanf("%d",&sam[m]);
			m++;
		}
		int count=1;
		for(i=0;i<n;i++){
			printf("%d",sam[i]);
			if(count<n){
				printf(" ");
				count++;
			}
		}
	}
	return 0;
}

7-53 求最大值及其下标 (20 分)

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:

输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:

在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
输入样例:

6
2 8 10 1 9 10

输出样例:

10 2
#include <stdio.h>
int main()
{
	int n,i,t=0;/*假设a[t]是最大值,即下标为0的元素最小*/ 
	scanf("%d",&n);
	int a[n];
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}/*找最大值a[t]*/ 
	for(i=1;i<n;i++){
		if(a[i]>a[t]){/*如果a[i]比假设的最大值还大*/ 
			t=i;/*再假设a[i[是新的最大值,即下标为i的元素最大*/
		}
	}
	printf("%d %d",a[t],t);
	return 0;
}

7-54 将数组中的数逆序存放 (20 分)

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入格式:

输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
输出格式:

在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
输入样例:

4
10 8 1 2

输出样例:

2 1 8 10
#include <stdio.h>
int main()
{
	int n,num[10],i;
	scanf("%d",&n);
	for(i=n-1;i>=0;i--){
		scanf("%d",&num[i]);
	}
	for(i=0;i<n;i++){
		printf("%d",num[i]);
		if(i<n-1){
			printf(" ");
		}
	}
	return 0;
}

7-55 矩阵运算 (20 分)

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式:

输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
输出格式:

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
输入样例:

4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1

输出样例:

35
#include <stdio.h>
int main(){
    int n, arr[10][10], i, j;
    int sum=0;
    scanf("%d", &n);
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            scanf("%d", &arr[i][j]);
            if(i!=n-1 && j!= n-1 && i+j!=n-1){
                sum += arr[i][j];
            }
        }
    }
    printf("%d\n", sum);
    return 0;
}