7-1 求平方根序列前N项和
本题要求编写程序,计算平方根序列的前N项之和。可包含头文件
math.h
,并调用sqrt
函数求平方根。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
10
输出样例:
sum = 22.47
代码段:
#include <stdio.h>
#include <math.h>
int main()
{
int a,i;
double sum;
scanf("%d",&a);
for(i=1;i<=a;i++)
{
sum=sum+sqrt(i);
}
printf("sum = %.2lf",sum);
}
7-2 统计整数的位数
从键盘读入一个整数,统计该数的位数。例如,输入12534,输出5;输入-99,输出2;输入0,输出1。
输入格式:
输入一个整数N(−105≤N≤105)。
输出格式:
在一行中按如下格式输出该数的位数。
It contains 位数 digits.
输入样例:
12534
输出样例:
It contains 5 digits.
代码段:
#include <stdio.h>
#include <math.h>
int main()
{
long int a,b;
scanf("%ld",&a);
a=abs(a);
b=a/10;
if(0<=b&&b<1)
printf("It contains 1 digits.");
if(1<=b&&b<10)
printf("It contains 2 digits.");
if(10<=b&&b<100)
printf("It contains 3 digits.");
if(100<=b&&b<1000)
printf("It contains 4 digits.");
if(b>1000)
printf("It contains 5 digits.");
}
7-3 输出闰年
输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。
输入格式:
输入在一行中给出21世纪的某个截止年份。
输出格式:
逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。
输入样例1:
2048
输出样例1:
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
输入样例2:
2000
输出样例2:
Invalid year!
代码段:
#include <stdio.h>
#include <math.h>
int main()
{
int year;
scanf("%d",&year);
if(year>2100||year<2000){
printf("Invalid year!");
}else{
int i;
int cnt=0;
for(i=2001;i<=year;i++){
if(i%4==0&&i%100!=0||i%400==0){
printf("%d\n",i);
cnt++;
}
}
if(cnt==0){
printf("None");
}
}
return 0;
}
7-4 求分数序列前N项和
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
代码段:
#include <stdio.h>
int main()
{
double n,i,sum=2,k,a=2,b=1,temp;
scanf("%lf",&n);
for(i=2;i<=n;i++)
{
temp=a;
a=a+b;
b=temp;
sum=sum+(a/b);
}
printf("%.2lf",sum);
}
7-5 求给定精度的简单交错序列部分和
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:
4E-2
输出样例1:
sum = 0.854457
输入样例2:
0.02
输出样例2:
sum = 0.826310
代码段:
#include <stdio.h>
#include <math.h>
int main(){
int fm = 1; //fm:分母
double eps, item = 0.0, sum = 0.0, sign = 1.0; //item:单个一项;sign:控制正负
scanf("%lf", &eps);
do{
item = sign*(1.0/fm);
sign = -sign; //每次对符号取负值
fm += 3; //每次对分母加三
sum += item;
}while( fabs(item) > eps );
printf("sum = %lf", sum);
return 0;
}
7-6 求cosx的近似值
已知cosx的近似计算公式如下:
cosx=1−x2/2!+x4/4!−x6/6!+...+(−1)nx2n/(2n)!
其中x为弧度,n为整数(0≤n≤100)。
现编写程序,根据用户输入的x和n的值,利用上述近似计算公式计算cosx的近似值(为保证数据准确,使用双精度浮点类型),输出结果时要求保留小数点后6位。
输入格式:
输入表示弧度的实数 x ,以及整数 n。
输出格式:
按“cos(x)=近似值”格式输出计算结果,保留小数点后6位。
输入样例:
1.5 3
输出样例:
cos(1.500000)=0.070117
代码段:
#include<stdio.h>
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
double sum = 1;
double temp = 1;
for (int i = 1; i <= n; i++)
{
temp *= (-1) * x * x / (2 * i * (2 * i - 1));
sum += temp;
}
printf("cos(%.6lf)=%.6lf", x, sum);
return 0;
}
7-7 统计学生成绩
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
- 大于等于90分为A;
- 小于90且大于等于80为B;
- 小于80且大于等于70为C;
- 小于70且大于等于60为D;
- 小于60为E。
输入格式:
输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。
输出格式:
在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。
输入样例:
7
77 54 92 73 60 65 69
输出样例:
1 0 2 3 1
代码段:
#include <stdio.h>
int main(){
int N, A = 0, B = 0, C = 0, D = 0, E = 0;
scanf("%d", &N);
int score[N];
for( int i=0; i<N; i++){
scanf(" %d", &score[i]);
if( score[i] < 60 )
E++;
else if( score[i] >= 60 && score[i] < 70 )
D++;
else if( score[i] >= 70 && score[i] < 80 )
C++;
else if( score[i] >= 80 && score[i] < 90 )
B++;
else
A++;
}
printf("%d %d %d %d %d", A, B, C, D, E);
return 0;
}
7-8 最佳情侣身高差
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。
输入格式:
输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。
输出格式:
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。
输入样例:
2
M 1.75
F 1.8
输出样例:
1.61
1.96
代码段:
#include <stdio.h>
int main()
{
int n;
float h,fh;
char xb;
scanf("%d\n",&n);
for(int i=1;i<=n;i++)
{
scanf("\n%c %f",&xb,&h);
fh=0;
if(xb=='M')
{
fh=h/1.09;
}
if(xb=='F')
{
fh=h*1.09;
}
printf("%.2f\n",fh);
}
}
7-9 简写转全称
在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:
- 每个简写字母对应一行输出
- 若字符为
C
或c
,则该行输出"BEIJING OLYMPIC GAMES" - 若字符为
J
或j
,则该行输出"JAPAN WORLD CUP" - 若字符为
K
或k
,则该行输出"KOREA WORLD CUP" - 若为其他字符,则该行原样输出该字符。
输入格式:
输入在一行中输入若干个字符,字符之间没有空格间隔,以回车结束。
输出格式:
按题目要求产生若干行输出。
输入样例:
kijckj
输出样例:
KOREA WORLD CUP
i
JAPAN WORLD CUP
BEIJING OLYMPIC GAMES
KOREA WORLD CUP
JAPAN WORLD CUP
代码段:
#include<stdio.h>
int main(void)
{
char ch;
while((ch=getchar())!='\n')
{
if(ch=='C'||ch=='c')
printf("BEIJING OLYMPIC GAMES\n");
else if(ch=='J'||ch=='j')
printf("JAPAN WORLD CUP\n");
else if(ch=='K'||ch=='k')
printf("KOREA WORLD CUP\n");
else
printf("%c\n",ch);
}
}
7-10 约分最简分式
分数可以表示为分子/分母
的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/
分隔,如:12/34
表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:
- 对于C语言,在
scanf
的格式字符串中加入/
,让scanf
来处理这个斜杠。 - 对于Python语言,用
a,b=map(int, input().split('/'))
这样的代码来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母
的形式表示分数。如5/6
表示6分之5。
输入样例:
66/120
输出样例:
11/20
代码段:
#include <stdio.h>
int main()
{
int a,b,i,count;
scanf("%d/%d",&a,&b);
for(i=b;i>1;i--)
{
if(a%i==0&&b%i==0)
{
a=a/i;
b=b/i;
}
}
printf("%d/%d",a,b);
}
7-11 猴子吃桃问题
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
代码段:
#include <stdio.h>
int main()
{
int num=1,n;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
num=num+1;
num=num*2;
}
printf("%d",num);
}
7-12 特殊a串数列求和
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
代码段:
#include <stdio.h>
#include <math.h>
int main()
{
int a,n,s,i,temp=0,sum=0;
scanf("%d %d",&a,&n);
for(i=1;i<=n;i++)
{
temp=temp+pow(10,i-1)*a;
sum=sum+temp;
}
printf("s = %d",sum);
}
7-13 穷举法搬运砖块问题
这是中国古典算术问题,某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。有多少种搬法用N人正好搬N块砖?
输入格式:
输入正整数N。
输出格式:
输出所有满足条件的搬法,每种搬法占一行。
每行按如下格式依次输出该搬法中男人、女人、小孩的人数,按男人人数的递增顺序输出,中间用空格间隔(=
前后没有多余的空格,行末也无空格)。
men=男人数 women=女人数 child=小孩数
若没有满足条件的搬法,则输出"No solution!"
输入样例1:
45
输出样例1:
men=0 women=15 child=30
men=3 women=10 child=32
men=6 women=5 child=34
men=9 women=0 child=36
输入样例2:
1
输出样例2:
No solution!
代码段:
#include<stdio.h>
int main()
{
int N;
int i,j,k;
int flag = 0;
scanf("%d", &N);
for(i=0; i<=N/3; i++){
for(j=0; j<=N/2; j++){
for(k=0; k<=N; k+=2){
if((i+j+k == N) && (3*i+2*j+k/2==N)){
flag =1;
printf("men=%d women=%d child=%d\n", i, j, k);
}
}
}
}
if(flag == 0) printf("No solution!\n");
return 0;
}
7-14 数字金字塔
输入一个正整数repeat (repeat<10),做repeat次下列运算:
- 输入一个正整数n(n<10),输出n行数字金字塔。
输出时使用以下语句:
printf(" ");
printf("%d ", i);
printf("\n");
输入格式:
输入在第1行中给出1个正整数repeat(repeat<10)
接下来repeat行,每行给出一个正整数n(n<10)
输出格式:
按照对应顺序的n值,依次输出repeat个数字金字塔
(n行数字金字塔的格式如样例所示,注意:每个数字后面跟一个空格。)
输入样例:
2
5
2
输出样例:
1
2 2 2
3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5
1
2 2 2
代码段:
#include<stdio.h>
int main()
{
int repeat;
scanf("%d", &repeat);
int m[50];
for (int i = 0; i < repeat; i++)
{
int n;
scanf("%d", &n);
m[i] = n;
}
for (int i = 0; i < repeat; i++)
{
for (int j = 1; j <= m[i]; j++)
{
for (int a = 1; a <= (m[i] - j) * 2; a++)
{
printf(" ");
}
for (int k = 1; k <= j * 2 - 1; k++)
{
printf("%d", j);
printf(" ");
}
printf("\n");
}
}
return 0;
}
7-15 输出N以内的所有素数
编程找出N(2≤N≤500)以内(即小于等于N)的所有素数。
输入格式:
输入整数N(2≤N≤500)。
输出格式:
每8个一行输出N以内的所有素数。注意每个数据均占5列,且采用右对齐。
输入样例1:
50
输出样例:
2 3 5 7 11 13 17 19
23 29 31 37 41 43 47
代码段:
#include <stdio.h>
int main()
{
int N,x=0,i,j;
scanf("%d",&N);
if(N>=2&&N<=500)
{
for(i=2;i<=N;i++)
{
for(j=2;j<=i;j++)
{
if(j==i)
{
printf("%5d",i);
x++;
}
if(i%j==0)
break;
if(x==8)
{
printf("\n");
x=0;
}
}
}
}
return 0;
}