2022秋 C理论A_ 编程练习3 - 循环结构

本文集锦涵盖了多种类型的编程题目,包括数学计算、序列求和、条件判断、数据处理等,旨在帮助读者提升编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7-1 求平方根序列前N项和

本题要求编写程序,计算平方根序列\sqrt{1}+\sqrt{2}+...+\sqrt{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 简写转全称

在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:

  • 每个简写字母对应一行输出
  • 若字符为Cc,则该行输出"BEIJING OLYMPIC GAMES"
  • 若字符为Jj,则该行输出"JAPAN WORLD CUP"
  • 若字符为Kk,则该行输出"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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值