求n以内最大的k个素数以及它们的和、数组元素循环右移问题、求最大值及其下标、将数组中的数逆序存放、矩阵运算
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中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−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;
}