7-1 求一组数组中的平均数
输入10个整数,输出这10个整数的的平均数,要求输出的平均数保留2位小数
输入样例:
1 2 3 4 5 6 7 8 9 10
输出样例:
5.50
参考答案:
#include <stdio.h>
int main(){int sum = 0;for (int i = 1; i <= 10; i++) {int num;scanf("%d", &num);sum += num;}double ans = sum/10.0;printf("%.2f",ans);return 0;
}
7-2 翻转数组
输入一组数(少于50个元素),要求对该数组元素进行倒序输出。
输入格式:
第一行输入一个数n表示数组中元素个数,然后一行输入n个整数,数与数间用空格隔开。
输出格式:
将该组数倒序输出,数与数间用一个空格隔开,第一个数前无空格,最后一个数后无空格。
输入样例:
12
36 74 20 96 21 48 99 68 84 81 34 53
输出样例:
53 34 81 84 68 99 48 21 96 20 74 36
参考答案:
#include <stdio.h>
int main(){int n;scanf("%d", &n);int num[60];for (int i = 0; i < n; i++) {scanf("%d", &num[i]);}for (int i = n-1; i >= 0; i--) {if (i != n-1) printf(" ");printf("%d", num[i]);}return 0;
}
7-3 求数组中偶数之和
从键盘输入n个整数存入一维数组中,计算数组元素中所有偶数之和并输出。
输入格式:
第一行,输入整数个数n;
第二行,n 个整数,数据之间用空格隔开。
输出格式:
输出和,最后换行。
输入样例:
8
10 19 18 16 17 15 14 13
输出样例:
58
参考答案:
#include <stdio.h>
int main(){int n;scanf("%d", &n);int sum = 0;for (int i = 0; i < n; i ++) {int num;scanf("%d", &num);if (num%2 == 0) sum += num;}printf("%d", sum);return 0;
}
7-4 计算天数
本题要求编写程序计算某年某月某日是该年中的第几天。
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62
参考答案:
#include<stdio.h>
int common_year[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int leap_year[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){int year,month,day;scanf("%d/%d/%d",&year,&month,&day);int ans = 0;if (year%400 == 0 || (year%4 == 0 && year%100 != 0)) {for (int i = 0; i < month; i++) {ans += leap_year[i];}ans += day;}else {for (int i = 0; i < month; i++) {ans += common_year[i];}ans += day;}printf("%d",ans);return 0;
}
7-5 输出该月天数
从键盘输入一个年份year和月份month,输出该月有多少天(考虑闰年)。
提示:如果年份能被400整除,则它是闰年;如果能被4整除,而不能被100整除,则也是闰年,否则不是闰年。
输入格式:
输入任意符合范围(1月~12月)的月份和(1900年~9999年)年份,且两个值之间空格分隔。
输入样例:
2000 2
输出样例:
year = 2000 month = 2 days=29
输入样例:
2014 8
输出样例:
year = 2014 month = 8 days=31
参考答案:
#include<stdio.h>
int common_year[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int leap_year[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){int year, month;scanf("%d %d", &year, &month);if ((year%400 == 0) || (year%4 == 0 && year%100 != 0)) {printf("year = %d month = %d days=%d", year, month, leap_year[month]); }else {printf("year = %d month = %d days=%d", year, month, common_year[month]); }return 0;
}
7-6 春夏秋冬
气象意义上,通常以阳历3~5月为春季(spring),6~8月为夏季(summer),9~11月为秋季(autumn),12月~来年2月为冬季(winter)。请根据输入公历的年份以及月份,输出对应的季节。
输入格式:
输入的数据格式是固定的YYYYMM的形式,即:年份占4个数位,月份占2个数位,且没有不合理的输入,如2017!@#$%13^&*之类的形式。
输出格式:
输出月份对应的季节(用英文单词表示,全部用小写字母)。
输入样例1:
201901
输出样例1:
winter
输入样例2:
201807
输出样例2:
summer
参考答案:
#include<stdio.h>
int main(){int num;scanf("%d", &num);int month = num%100;if (month >= 3 && month <= 5) printf("spring");if (month >= 6 && month <= 8) printf("summer");if (month >= 9 && month <= 11) printf("autumn");if ((month >= 1 && month <= 2) || month == 12) printf("winter");return 0;
}
7-7 求N分之一序列前N项和
本题要求编写程序,计算序列 1 + 1/2 + 1/3 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
输入样例:
6
输出样例:
sum = 2.450000
参考答案:
#include<stdio.h>
int main(){int n;scanf("%d", &n);double sum = 0;for (int i = 1; i <= n; i ++) {sum += 1.0/i;}printf("sum = %.6f", sum);return 0;
}
7-8 求简单交错序列前N项和
本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。
输入样例:
10
输出样例:
sum = 0.819
参考答案:
#include<stdio.h>
int main(){int n;scanf("%d", &n);int flag = 1;double ans = 0;for (int i = 1; i <= n; i++) {ans += flag*1.0/(3*i-2);flag = -flag;}printf("sum = %.3f", ans);return 0;
}
7-9 求交错序列前N项和
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。
输入样例:
5
输出样例:
0.917
参考答案:
#include<stdio.h>
int main(){int n;scanf("%d", &n);int flag = 1;double ans = 0;for (int i = 1; i <= n; i++) {ans += flag*1.0*i/(2*i-1);flag = -flag;}printf("%.3f", ans);return 0;
}
7-10 求阶乘序列前N项和
本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和。
输入格式:
输入在一行中给出一个不超过12的正整数N。
输出格式:
在一行中输出整数结果。
输入样例:
5
输出样例:
153
参考答案:
#include<stdio.h>int factorial(int x) {int y = 1;for (int i = 1; i <= x; i++) {y *= i;}return y;
}int main(){int n;scanf("%d", &n);int ans = 0;for (int i = 1; i <= n; i++) {ans += factorial(i);}printf("%d", ans);return 0;
}
7-11 求分数序列前N项和
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
参考答案:
#include<stdio.h>
int main(){int n;scanf("%d", &n);double ans = 0;double fenzi = 2;double fenmu = 1;for (int i = 1; i <= n; i++) {ans += fenzi/fenmu;double new_fenzi = fenzi + fenmu;double new_fenmu = fenzi;fenzi = new_fenzi;fenmu = new_fenmu;}printf("%.2f", ans);return 0;
}
7-12 素数对猜想
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
参考答案:
#include<stdio.h>
#include <stdbool.h>
bool isPrime(int x) {bool flag = true;if (x == 1) flag = false;if (x == 2) flag = true;if (x > 2) {for (int i = 2; i <= sqrt(x); i++) {if (x%i == 0) {flag = false;break;}}}return flag;
}int main(){int n;scanf("%d",&n);int prime[9999];int index = 0;int ans = 0;for (int i = 1; i <= n; i++) {if (isPrime(i) == true) {prime[index] = i;index++;}}for (int i = 1; i < index; i++) {if (prime[i] - prime[i-1] == 2) {ans++;}}printf("%d",ans);
}
7-13 求n以内最大的k个素数以及它们的和
本题要求计算并输出不超过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 isPrime(int x) {int flag = 1;if (x == 1) flag = 0;if (x == 2) flag = 1;if (x > 2) {for (int i = 2; i <= sqrt(x); i++) {if (x%i == 0) {flag = 0;break;}}}return flag;
}
int main(){int n, k;scanf("%d %d",&n, &k);int sum = 0;int flag = 1;while(n > 0 && k > 0) {if (isPrime(n) == 1) {if (flag == 0) printf("+");printf("%d",n);sum += n;flag = 0;k--;}n--;}printf("=%d",sum);
}
7-14 哥德巴赫猜想
哥德巴赫猜想大家都很熟悉,今日常见的猜想陈述为欧拉的版本,即任一大于2的偶数都可写成两个素数之和,亦称为“强哥德巴赫猜想”或“关于偶数的哥德巴赫猜想”。由于一个偶数可能有多组不同的素数对,所以要求输出两个彼此最接近的素数。
输入格式:
输入有多行,每一行有一个偶整数n(5<n≤10000)
输出格式:
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数(较小的素数放在较大的素数前).
输入样例:
20
30
40
输出样例:
7 13
13 17
17 23
参考答案:
#include<stdio.h>
int isPrime(int x) {int flag = 1;if (x == 1) flag = 0;if (x == 2) flag = 1;if (x > 2) {for (int i = 2; i <= sqrt(x); i++) {if (x%i == 0) {flag = 0;break;}}}return flag;
}
int main(){int n, a, b;while(scanf("%d", &n) != EOF){for(int i = n/2; i >= 1; i --){a = i;b = n-i;if(isPrime(i) == 1 && isPrime(n-i) == 1){break;}}printf("%d %d\n", a, b);}return 0;
}
7-15 数组元素循环右移问题
一个数组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;scanf("%d %d", &n, &m);int num[110];for (int i = 0; i < n; i++) scanf("%d", &num[i]);for (int i = 0; i < m; i++) {int temp = num[n-1];for (int j = n-1; j > 0; j--) {num[j] = num[j-1];}num[0] = temp;}for (int i = 0; i < n; i++) {if (i != 0) printf(" ");printf("%d", num[i]);}return 0;
}
7-16 猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
参考答案:
#include<stdio.h>
int flag[1010] = {0};
int main(){int n;scanf("%d", &n);int cnt = 0;int total = n;while(total > 1) {for (int i = 1; i <= n; i++) {if (flag[i] == 1) continue;if (flag[i] == 0) cnt++;if (cnt == 3) {flag[i] = 1;cnt = 0;total--;}}}for (int i = 1; i <= n; i++) {if (flag[i] == 0) {printf("%d", i);break;}}return 0;
}
7-17 数组循环左移
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
8 3
1 2 3 4 5 6 7 8
输出样例:
4 5 6 7 8 1 2 3
参考答案:
#include<stdio.h>
int main(){int n, m;scanf("%d %d", &n, &m);int num[1010];for (int i = 0; i < n; i++) scanf("%d", &num[i]);for (int i = 0; i < m; i++) {int temp = num[0];for (int j = 0; j < n-1; j++) {num[j] = num[j+1];}num[n-1] = temp;}for (int i = 0; i < n; i++) {if (i != 0) printf(" ");printf("%d", num[i]);}return 0;
}
7-18 利用数组计算斐波那契数列
本题要求编写程序,利用数组计算菲波那契(Fibonacci)数列的前N项,每行输出5个,题目保证计算结果在长整型范围内。Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,例如::1,1,2,3,5,8,13,...。
输入格式:
输入在一行中给出一个整数N(1≤N≤46)。
输出格式:
输出前N个Fibonacci数,每个数占11位,每行输出5个。如果最后一行输出的个数不到5个,也需要换行。
如果输入的N不在有效范围内,则输出"Invalid."。
输入样例1:
7
输出样例1:
1 1 2 3 58 13
输入样例2:
0
输出样例2:
Invalid.
参考答案:
#include<stdio.h>
int main(){int n;scanf("%d", &n);int num[50];num[1] = 1;num[2] = 1;if (n < 1 || n > 46) {printf("Invalid.");return 0;}if (n >= 3) {for (int i = 3; i <= n; i++) {num[i] = num[i-1] + num[i-2];}}for (int i = 1; i <= n; i++) {printf("%11d", num[i]);if (i%5 == 0 || i == n) printf("\n");}return 0;
}