专栏首页IT技术圈(CSDN)100例C语言经典编程题 | 浙大版C语言题目集第三版,助力你C语言从入门到精通

100例C语言经典编程题 | 浙大版C语言题目集第三版,助力你C语言从入门到精通

获取每道题详细解答请在公众号【C you again】“C语言题目集”栏目查看。

下载pdf版本请在公众号【C you again】回复“c-pdf”自行获取。

1、练习2-1 Programming in C is fun!

本题要求编写程序,输出一个短句“Programming in C is fun!”。

输入格式:

本题目没有输入。

输出格式:

在一行中输出短句“Programming in C is fun!”。

代码:

#include<stdio.h>
int main()
{
  printf("Programming in C is fun!\n"); 
}

2、练习2-3 输出倒三角图案

本题要求编写程序,输出指定的由“*”组成的倒三角图案。

输入格式:

本题目没有输入。

输出格式:

按照下列格式输出由“*”组成的倒三角图案。

* * * * * * * * * *

代码:

#include<stdio.h>
int main()
{
  
  printf("* * * *\n");
  printf(" * * *\n");
  printf("  * *\n");
  printf("   *\n");
  return 0;
}

3、练习2-4 温度转换

本题要求编写程序,计算华氏温度150°F对应的摄氏温度。计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型。

输入格式:

本题目没有输入。

输出格式:

按照下列格式输出

fahr = 150, celsius = 计算所得摄氏温度的整数值

代码:

#include<stdio.h>
int main()
{
  int F=150;
  printf("fahr = 150, celsius = %d\n",5*(F-32)/9);
  
}

4、练习2-6 计算物体自由下落的距离

一个物体从100米的高空自由落下。编写程序,求它在前3秒内下落的垂直距离。设重力加速度为10米/秒 2。

输入格式:

本题目没有输入。

输出格式:

按照下列格式输出

height = 垂直距离值

结果保留2位小数。

代码:

#include<stdio.h>
#include<math.h>
int main()
{
  int g=10;
  int t=3;
  printf("height = %.2lf\n",(double)(g/2*(int)pow(t,2)));
}

5、练习2-8 计算摄氏温度

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。

输入格式:

输入在一行中给出一个华氏温度。

输出格式:

在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。

输入样例:

150

输出样例:

Celsius = 65

代码:

#include<stdio.h>
int main()
{
  
  int c;
  scanf("%d\n",&c);
  printf("Celsius = %d\n",5*(c-32)/9);
}

6、练习2-9 整数四则运算

本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。

输入格式:

输入在一行中给出2个正整数A和B。

输出格式:

在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。

输入样例:

3 2

输出样例:

3 + 2 = 5 3 - 2 = 1 3 * 2 = 6 3 / 2 = 1

代码:

#include<stdio.h>
int main()
{
  int m,n;
  scanf("%d %d\n",&m,&n);
  if(n!=0){
  printf("%d + %d = %d\n",m,n,m+n);
  printf("%d - %d = %d\n",m,n,m-n);
  printf("%d * %d = %d\n",m,n,m*n);
  printf("%d / %d = %d\n",m,n,m/n);
    
  }
  return 0;
}

7、练习2-10 计算分段函数[1]

本题目要求计算下列分段函数f(x)的值:

输入格式:

输入在一行中给出实数x。

输出格式:

在一行中按“f(x) = result”的格式输出,其中x与result都保留一位小数。

输入样例1:

10

输出样例1:

f(10.0) = 0.1

输入样例2:

0

输出样例2:

f(0.0) = 0.0

代码:

#include<stdio.h>
int main()
{
  double x;
  scanf("%lf\n",&x);
  if(x==0) printf("f(%.1lf) = %.1lf\n",x,x);
  else printf("f(%.1lf) = %.1lf\n",x,1/x);
  return 0;
}

8、练习2-11 计算分段函数[2]

本题目要求计算下列分段函数f(x)的值:

注:可在头文件中包含 math.h ,并调用 sqrt 函数求平方根,调用 pow 函数求幂。

输入格式:

输入在一行中给出实数x。

输出格式:

在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。

输入样例1:

10

输出样例1:

f(10.00) = 3.16

输入样例2:

-0.5

输出样例2:

f(-0.50) = -2.75

代码:

#include<stdio.h>
#include<math.h>
int main()
{
  double x;
  scanf("%lf\n",&x);
  if(x>=0) printf("f(%.2lf) = %.2lf\n",x,pow(x,0.5));
  else printf("f(%.2lf) = %.2lf\n",x,pow(x+1,2)+2.0*x+1/x);
  return 0;
}

9、练习2-12 输出华氏-摄氏温度转换表

输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper]、且每次增加2华氏度的华氏-摄氏温度转换表。

温度转换的计算公式:C=5×(F−32)/9,其中:C表示摄氏温度,F表示华氏温度。

输入格式:

在一行中输入2个整数,分别表示lower和upper的值,中间用空格分开。

输出格式:

第一行输出:“fahr celsius”

接着每行输出一个华氏温度fahr(整型)与一个摄氏温度celsius(占据6个字符宽度,靠右对齐,保留1位小数)。

若输入的范围不合法,则输出"Invalid."。

输入样例1:

32 35

输出样例1:

fahr celsius 32 0.0 34 1.1

输入样例2:

40 30

输出样例2:

Invalid.

代码:

#include<stdio.h>
int main()
{
  int lower,upper;
  int i;
  scanf("%d %d",&lower,&upper);
  if(lower<=upper)
    {
      printf("fahr celsius\n");
      for(i=lower;i<=upper;i+=2)
      {
        printf("%d%6.1lf\n",i,(double)(5.0*(i-32)/9.0));
      }

    }
    else printf("Invalid.\n");
  return 0;
}

10、练习2-13 求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);
  int i;
  double sum=0.0;
  for(i=1;i<=n;i++)
  {
    sum+=1.0/i;
  }
  printf("sum = %.6lf\n",sum);
  return 0;
}

11、练习2-14 求奇数分之一序列前N项和

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + … 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

23

输出样例:

sum = 2.549541

代码:

#include<stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  int i;
  double sum=0.0;
  int d=1;
  for(i=1;i<=n;i++)
  {
    sum+=1.0/d;
    d+=2;
  }
  printf("sum = %.6lf\n",sum);
  return 0;
}

12、练习2-15 求简单交错序列前N项和

本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + … 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。

输入样例:

10

输出样例:

sum = 0.819

代码:

#include<stdio.h>
int main()
{
  int n;
  int l=1;
  scanf("%d",&n);
  int i;
  double sum=0.0;
  int d=1;
  for(i=1;i<=n;i++)
  {
    sum+=1.0/d*l;
    d+=3;
    l=-l;
  }
  printf("sum = %.3lf\n",sum);
  return 0;
}

13、练习2-17 生成3的乘方表

输入一个非负整数n,生成一张3的乘方表,输出3​0~3​n的值。可调用幂函数计算3的乘方。

输入格式:

输入在一行中给出一个非负整数n。

输出格式:

按照幂的递增顺序输出n+1行,每行格式为“pow(3,i) = 3的i次幂的值”。题目保证输出数据不超过长整型整数的范围。

输入样例:

3

输出样例:

pow(3,0) = 1 pow(3,1) = 3 pow(3,2) = 9 pow(3,3) = 27

代码:

#include<stdio.h>
#include<math.h>
int main()
{
  int n;
  scanf("%d",&n);
  int i;
  for(i=0;i<=n;i++)
  {
    printf("pow(3,%d) = %d\n",i,(int)pow(3,i));
  }
  return 0;
}

14、练习2-18 求组合数

本题要求编写程序,根据公式C n​m= ​ m ! ( n − m ) ! ​ n ! \frac{​m!(n−m)!}{​n!} ​n!​m!(n−m)!​ 算出从n个不同元素中取出m个元素(m≤n)的组合数。

建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。

输入格式:

输入在一行中给出两个正整数m和n(m≤n),以空格分隔。

输出格式:

按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。

输入样例:

2 7

输出样例:

result = 21

代码:

#include<stdio.h>
double fun(int n)
{
    int i;
    double t=1.0;
    for(i=1;i<=n;i++)
    {
        t*=i;
    }
    return t;
}
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    double result=fun(n)/(fun(m)*fun(n-m));
    printf("result = %.0lf\n",result);
}

15、习题2-1 求整数均值

本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。

输入格式:

输入在一行中给出4个整数,其间以空格分隔。

输出格式:

在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。

输入样例:

1 2 3 4

输出样例:

Sum = 10; Average = 2.5

代码:

#include<stdio.h>
int main()
{
  int a1,a2,a3,a4;
  scanf("%d %d %d %d",&a1,&a2,&a3,&a4);
  printf("Sum = %d; Average = %.1lf\n",a1+a2+a3+a4,(double)(a1+a2+a3+a4)/4.0);
  return 0;

}

16、习题2-2 阶梯电价

为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

输入格式:

输入在一行中给出某用户的月用电量(单位:千瓦时)。

输出格式:

在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。

输入样例1:

10

输出样例1:

cost = 5.30

输入样例2:

100

输出样例2:

cost = 55.50

代码:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n<=50)
    {
        if(n<0) printf("Invalid Value!\n");
        else printf("cost = %.2lf\n",n*0.53);
    }
    else printf("cost = %.2lf\n",(50*0.53)+(n-50)*(0.53+0.05));
    return 0;
}

17、习题2-3 求平方与倒数序列的部分和

本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m2+1/m+(m+1)​2+1/(m+1)+⋯+n2+1/n。

输入格式:

输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例:

5 10

输出样例:

sum = 355.845635

代码:

#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    int i;
    if(m<=n&&m!=0&&n!=0){
    double sum=0.0;
    for(i=m;i<=n;i++)
    {
        sum+=(double)pow(i,2)+1.0/i;
    }
    printf("sum = %.6lf\n",sum);}
    return 0;
}

18、习题2-4 求交错序列前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 i;
    if(n!=0){
    double sum=0.0;
    int t1=1;
    int t2=1;
    int temp=1;
    for(i=1;i<=n;i++)
    {
        sum+=((double)t1/t2)*temp;
        t1++;
        t2+=2;
        temp=-temp;
    }
    printf("%.3lf\n",sum);}
    return 0;
}

19、习题2-5 求平方根序列前N项和

本题要求编写程序,计算平方根序列 1 \sqrt{1} 1 ​+ 2 \sqrt{2} 2 ​+ 3 \sqrt{3} 3 ​+⋯的前N项之和。可包含头文件math.h,并调用sqrt函数求平方根。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

10

输出样例:

sum = 22.47

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    //if(n!=0){
    double sum=0.0;
    for(i=1;i<=n;i++)
    {
        sum+=sqrt((double)i);
    }
    printf("sum = %.2lf\n",sum);
    //}
    return 0;
}

20、习题2-6 求阶乘序列前N项和

本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和。

输入格式:

输入在一行中给出一个不超过12的正整数N。

输出格式:

在一行中输出整数结果。

输入样例:

5

输出样例:

153

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    //if(n!=0){
    long long sum=0;
    for(i=1;i<=n;i++)
    {
        sum+=fun(i);
    }
    printf("%lld\n",sum);
    //}
    return 0;
}

int fun(int n)
{
    int i;
    long long t=1;
    for(i=1;i<=n;i++)
    {
        t=t*i;
    }
   // printf("t=%lld\n",t);
    return t;
}

21、练习3-2 计算符号函数的值

对于任一整数n,符号函数sign(n)的定义如下:

请编写程序计算该函数对任一输入整数的值。

输入格式:

输入在一行中给出整数n。

输出格式:

在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

输入样例1:

10

输出样例1:

sign(10) = 1

输入样例2:

0

输出样例2:

sign(0) = 0

输入样例3:

-98

输出样例3:

sign(-98) = -1

代码:

#include<stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  if(n>=0)
  {
    if(n>0) printf("sign(%d) = 1\n",n);
    else printf("sign(%d) = 0\n",n);
  }
  else printf("sign(%d) = -1\n",n);
}

22、练习3-4 统计字符

本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。

输入格式:

输入为10个字符。最后一个回车表示输入结束,不算在内。

输出格式:

在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。

输入样例:

aZ & 09 Az

输出样例:

letter = 4, blank = 3, digit = 2, other = 1

代码:

#include<stdio.h>
int main()
{
    char str[10];
    int i;
    int letter=0;
    int blank=0;
    int digit=0;
    int other=0;
    for(i=0;i<10;i++)
    {
       scanf("%c",&str[i]);
       if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z') letter++;
       else if(str[i]==' '||str[i]=='\n') blank++;
       else if(str[i]>='0'&&str[i]<='9') digit++;
       else other++;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d\n",letter,blank,digit,other);
    return 0;
}

23、练习3-5 输出闰年

输出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>
int main()
{
  int n;
  scanf("%d",&n);
  if(n>=2001&&n<=2100)
  {
    int temp=0;
    int i;
    for(i=2001;i<=n;i++)
    {
      if((i%4==0&&i%100!=0)||i%400==0)
      {printf("%d\n",i);temp++;}
    }
    if(temp==0) printf("None\n");
  }
  else
  printf("Invalid year!\n");
  return 0;
}

24、练习3-7 成绩转换

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在一行中给出一个整数的百分制成绩。

输出格式:

在一行中输出对应的五分制成绩。

输入样例:

90

输出样例:

A

代码:

#include<stdio.h>
int main()
{
  int n;
  scanf("%d",&n);
  if(n>=90) printf("A\n");
  else
  {
    if(n>=80) printf("B\n");
    else
    {
      if(n>=70) printf("C\n");
      else
      {
        if(n>=60) printf("D\n");
        else printf("E\n");
      }
    }
  }
}

25、练习3-8 查询水果价格

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple [2] pear [3] orange [4] grape [0] exit

用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

输入格式:

输入在一行中给出用户连续输入的若干个编号。

输出格式:

首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

输入样例1:

3 -1 0 2

输出样例1:

[1] apple [2] pear [3] orange [4] grape [0] exit price = 4.10 price =0.00

输入样例2:

1 2 3 3 4 4 5 6 7 8

输出样例2:

[1] apple [2] pear [3] orange [4] grape [0] exit price = 3.00 price =2.50 price = 4.10 price = 4.10 price = 10.20

代码:

#include<stdio.h>
int main()
{
    int n;
    int arr[1000];
    int i=0;
    while(scanf("%d",&arr[i])!=EOF&&arr[i]!=0)
    {
        i++;
    }
    int t=i;
    printf("[1] apple\n");
    printf("[2] pear\n");
    printf("[3] orange\n");
    printf("[4] grape\n");
    printf("[0] exit\n");
    int l=1;
    for(i=0;i<t;i++)
    {
       if(arr[i]!=0&&l<=5)
       {
           if(arr[i]==1) printf("price = 3.00\n");
           else if(arr[i]==2) printf("price = 2.50\n");
           else if(arr[i]==3) printf("price = 4.10\n");
           else if(arr[i]==4) printf("price = 10.20\n");
           else  printf("price = 0.00\n");
           l++;
       }
    }
    return 0;
}

26、习题3-1 比较大小

本题要求将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

4 2 8

输出样例:

2->4->8

代码:

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

}

微信搜索公众号【C you again】:

27、习题3-2 高速公路超速处罚

按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。

输入格式:

输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。

输出格式:

在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。

输入样例1:

65 60

输出样例1:

OK

输入样例2:

110 100

输出样例2:

Exceed 10%. Ticket 200

输入样例3:

200 120

输出样例3:

Exceed 67%. License Revoked

代码:

#include<stdio.h>
int main()
{
    int m; //车速
    int n; //限速
    scanf("%d %d",&m,&n);
    int t1=n+n*0.1;
    int t2=n+n*0.5;
   // printf("%d %d\n",t1,t2);
    if(m<t1) printf("OK\n");
    if(m>=t1&&m<t2)
    {
        double temp1=(m-n)/(double)n*100.0;
        double temp2=temp1-(int)temp1;
        int temp;
        if(temp2>=0.5) temp=(int)temp1+1;
        else temp=(int)temp1;
        printf("Exceed %d%%. Ticket 200\n",temp);
    }
    if(m>=t2)
    {
        double temp1=(m-n)/(double)n*100.0;
        double temp2=temp1-(int)temp1;
        int temp;
        if(temp2>=0.5) temp=(int)temp1+1;
        else temp=(int)temp1;
        printf("Exceed %d%%. License Revoked\n",temp);
    }
}

28、习题3-3 出租车计价

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为3公里,起步费10元;
  • 超起步里程后10公里内,每公里2元;
  • 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
  • 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34

代码:

#include<stdio.h>
int main()
{
    double k;
    int fen;
    scanf("%lf %d",&k,&fen);
    double money1=fen/5*2.0;
    double money2=10.0;
    double money;
    if(k<3.0) money=money1+money2;
    else
    {
        if(k<10.0) money=money1+money2+(k-3.0)*2.0;
        if(k>=10.0) money=money1+money2+(10.0-3.0)*2.0+(k-10.0)*3.0;
    }
    printf("%.0lf\n",money);
    return 0;
}

29、习题3-4 统计学生成绩

本题要求编写程序读入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;
    scanf("%d",&N);
    int i;
    int arr[5]={0};
    int m;
    for(i=0;i<N;i++)
    {
        scanf("%d",&m);
        if(m>=90)arr[0]++;
        else if(m<90&&m>=80) arr[1]++;
        else if(m<80&&m>=70) arr[2]++;
        else if(m<70&&m>=60) arr[3]++;
        else arr[4]++;
    }
    for(i=0;i<5;i++)
    {
        if(i==5-1) printf("%d\n",arr[i]);
        else printf("%d ",arr[i]);
    }
    return 0;
}

30、习题9-1 时间换算

本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。

输入格式:

输入在第一行中以hh:mm:ss的格式给出起始时间,第二行给出整秒数n(<60)。

输出格式:

输出在一行中给出hh:mm:ss格式的结果时间。

输入样例:

11:59:40 30

输出样例:

12:00:10

代码:

#include <stdio.h>
int main()
{
    int h,m,s,n,ad;
    scanf("%d:%d:%d",&h,&m,&s);
    scanf("%d",&n);
    ad=3600*h+60*m+s+n;
    ad=ad%86400;
    h=(ad-ad%3600)/3600;
    ad=ad%3600;
    m=(ad-ad%60)/60;
    ad=ad%60;
    s=ad;
    printf("%02d:%02d:%02d",h,m,s);
    }

31、习题9-3 平面向量加法

本题要求编写程序,计算两个二维平面向量的和向量。

输入格式:

输入在一行中按照“x1 y1 x​2 y​2 ​​ ”的格式给出两个二维平面向量v1=(x1, y1) 和v2=(x2 ,y2) 的分量。

输出格式:

在一行中按照(x, y)的格式输出和向量,坐标输出小数点后一位(注意不能输出−0.0)。

输入样例:

3.5 -2.7 -13.9 8.7

输出样例:

(-10.4, 6.0)

代码:

#include <stdio.h>
#include <math.h>
int main(){
	double x1,y1,x2,y2;
	scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
	double x,y;
	x=x1+x2;
	y=y1+y2;


	if(fabs(x)<0.05){
		x=fabs(x);
	}
	if(fabs(y)<0.05){
		y=fabs(y);
	}

	printf("(%.1f, %.1f)",x,y);

	return 0;
}

32、习题9-4 查找书籍

给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。

输入格式:

输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。

输出格式:

在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。

输入样例:

3 Programming in C 21.5 Programming in VB 18.5 Programming in Delphi 25.0

输出样例:

25.00, Programming in Delphi 8.50, Programming in VB

代码:

#include<stdio.h>

struct book
{
    char name[33];
    double price;
};
int main()
{
    int n;
    struct book arr[10];
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
    {
        getchar();
        gets(arr[i].name);
        scanf("%lf",&arr[i].price);
    }
    int index1=0;
    int index2=0;
    for(i=1;i<n;i++)
    {
       if(arr[i].price>=arr[index1].price) index1=i;
    }
    for(i=1;i<n;i++)
    {
       if(arr[i].price<=arr[index2].price) index2=i;
    }

    printf("%.2lf, %s\n",arr[index1].price,arr[index1].name);
    printf("%.2lf, %s\n",arr[index2].price,arr[index2].name);
    return 0;

}

33、习题9-5 通讯录排序

输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。

输入格式:

输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+、-组成的字符串。

输出格式:

按照年龄从大到小输出朋友的信息,格式同输出。

输入样例:

3 zhang 19850403 13912345678 wang 19821020 +86-0571-88018448 qian 19840619 13609876543

输出样例:

wang 19821020 +86-0571-88018448 qian 19840619 13609876543 zhang 19850403 13912345678

代码:

#include<stdio.h>

struct fri
{
    char name[11];
    char brithday[10];
    char pNumber[18];
    int temp;
}tt;
int main()
{
    struct fri arr[10];
    int n;
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
    {
       scanf("%s %s %s",&arr[i].name,&arr[i].brithday,&arr[i].pNumber);
       int temp1=(arr[i].brithday[0]-'0')*1000+(arr[i].brithday[1]-'0')*100+(arr[i].brithday[2]-'0')*10+(arr[i].brithday[3]-'0')*1;
       int temp2=(arr[i].brithday[4]-'0')*10+(arr[i].brithday[5]-'0')*1;
       int temp3=(arr[i].brithday[6]-'0')*10+(arr[i].brithday[7]-'0')*1;
       arr[i].temp=(9999-temp1)*365+(12-temp2)*30+(30-temp3)*1;
    }
    int index;
    int j;
    for(i=0;i<n-1;i++)
    {
        index=i;
        tt=arr[i];
        for(j=i+1;j<n;j++)
        {
            if(arr[j].temp>=arr[index].temp) index=j;
        }
        arr[i]=arr[index];
        arr[index]=tt;
    }
    for(i=0;i<n;i++)
    {
        printf("%s %s %s\n",arr[i].name,arr[i].brithday,arr[i].pNumber);
    }
    return 0;
}

34、练习4-6 猜数字游戏

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:

输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:

在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:

58 4 70 50 56 58 60 -2

输出样例:

Too big Too small Too small Good Guess!

代码:

#include<stdio.h>
int main()
{
    int random;
    int N;
    scanf("%d %d",&random,&N);
    int i=0;
    int arr[101];
    while(scanf("%d",&arr[i])!=EOF&&arr[i]>=0)
    {
        i++;
    }
    int n=i;
    int l=0;
    for(i=0;i<n;i++)
    {
        if(arr[i]>random) {printf("Too big\n");l++;}
        else if(arr[i]<random) {printf("Too small\n");l++;}
        else {l++;break;}
        if(l>N) break;
    }
    if(l==1) printf("Bingo!\n");
    else if(l>1&&l<=3) printf("Lucky You!\n");
    else if(l>3&&l<=N) printf("Good Guess!\n");
    else printf("Game Over\n");
    return 0;

}

35、练习4-7 求e的近似值

自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。本题要求对给定的非负整数n,求该级数的前n项和。

输入格式:

输入第一行中给出非负整数n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180

代码:

#include<stdio.h>

double fun(int n)  //递归算法
{
    if(n==0||n==1) return 1;
    else return n*fun(n-1);
}
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    double sum=1.0;
    for(i=1;i<=n;i++)
    {
       sum+=1.0/fun(i);
    }
    printf("%.8lf\n",sum);
}

36、练习4-10 找出最小值

本题要求编写程序,找出给定一系列整数中的最小值。

输入格式:

输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。

输出格式:

在一行中按照“min = 最小值”的格式输出n个整数中的最小值。

输入样例:

4 -2 -123 100 0

输出样例:

min = -123

代码:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    int index;
    for(i=0;i<n;i++)
    {
       int t;
       scanf("%d",&t);
       if(i==0)index=t;
       else
       {
           if(t<=index) index=t;
       }

    }
    printf("min = %d\n",index);
    return 0;

}

37、练习4-11 统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

代码:

#include<stdio.h>

int fun(int n)
{
    int t=sqrt(n);
    int i;
    int temp=1;
    for(i=2;i<=t;i++)
    {
        if(n%i==0)
        {
            temp=0;
            break;
        }
    }
    return temp;
}
int main()
{
    int M,N;
    scanf("%d %d",&M,&N);
    int i;
    if(M<2)M=2;
    int sum=0;
    int l=0;
    for(i=M;i<=N;i++)
    {
        int temp=fun(i);
        if(temp==1)
        {
            sum+=i;
            l++;
        }
    }
    printf("%d %d\n",l,sum);
    return 0;
}

38、习题4-1 求奇数和

本题要求计算给定的一系列正整数中奇数的和。

输入格式:

输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。

输出格式:

在一行中输出正整数序列中奇数的和。

输入样例:

8 7 4 3 70 5 6 101 -1

输出样例:

116

代码:

#include<stdio.h>
int fun(int n)
{
    if(n%2==0) return 0;
    else return 1;
}
int main()
{
    int n;
    int sum=0;
    while(scanf("%d",&n)&&(n!=0&&n>0))
    {
       int temp=fun(n);
       if(temp==1) sum+=n;
    }
    printf("%d\n",sum);
    return 0;
}

39、习题4-2 求幂级数展开的部分和

已知函数ex 可以展开为幂级数1+x+x2/2!+x3/3!+⋯+x​k/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。

输入格式:

输入在一行中给出一个实数x∈[0,5]。

输出格式:

在一行中输出满足条件的幂级数部分和,保留小数点后四位。

输入样例:

1.2

输出样例:

3.3201

代码:

#include<stdio.h>

double fun(int n)
{
    if(n==1||n==0) return 1;
    else return n*fun(n-1);
}
int main()
{
    double n;
    scanf("%lf",&n);
    int i;
    double sum=1.0;
    double n1=n;
    for(i=1;;i++)
    {
       double t=n1/fun(i);
       sum+=t;
       n1*=n;
       if(t<0.00001)break;

    }
    printf("%.4lf\n",sum);
    return 0;
}

40、习题4-3 求分数序列前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);
    int i;
    double m=2.0;
    double n=1.0;
    double sum=0;
    for(i=1;i<=N;i++)
    {
        sum+=m/n;
        double t=m+n;
        n=m;
        m=t;
    }
    printf("%.2lf\n",sum);
    return 0;
}

41、习题4-4 特殊a串数列求和

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:

输入在一行中给出不超过9的正整数a和n。

输出格式:

在一行中按照“s = 对应的和”的格式输出。

输入样例:

2 3

输出样例:

s = 246

代码:

#include<stdio.h>
int main()
{
    int a,n;
    scanf("%d %d",&a,&n);
    int i;
    int sum=0;
    int t=a;
    for(i=1;i<=n;i++)
    {
        sum+=t;
        t=t*10+a;
    }
    printf("s = %d\n",sum);
    return 0;
}

42、习题4-6 水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153 370 371 407

代码:

#include<stdio.h>
void fun1(int *m,int *n,int N)
{
    int i;
    int t1,t2;
    t1=t2=1;
    for(i=1;i<=N-1;i++)
        t1*=10;
    for(i=1;i<=N;i++)
        t2*=10;
    *m=t1;*n=t2-1;
}

int fun2(int n,int N)
{
    int i;
    int t;
    int sum=0;
    int tt=n;
    while(n)
    {
        t=1;
        int temp=n%10;
        for(i=1;i<=N;i++)
        {
            t*=temp;
        }
        sum+=t;
        n/=10;
    }
    if(tt==sum) return 1;
    else return 0;
}
int main()
{
    int N;
    scanf("%d",&N);
    int m,n;
    fun1(&m,&n,N);  //找出最小N位数和最大N位数
    //printf("%d %d\n",m,n);
    int i;
    for(i=m;i<=n;i++)
    {
        int temp=fun2(i,N);
        if(temp==1) printf("%d\n",i);
    }
    return 0;
}

43、习题4-7 最大公约数和最小公倍数

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(≤1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

代码:

#include<stdio.h>
int main()
{
    int M,N;
    scanf("%d %d",&M,&N);
    int a,b;
    a=M;
    b=N;
    int temp;
    temp=M%N;
    while(temp)   //辗转相除法求最大公约数
    {
        M=N;
        N=temp;
        temp=M%N;
    }
    printf("%d %d\n",N,a*b/N);
    return 0;

}

44、习题7-5 找鞍点

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:

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

输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9

输出样例1:

2 1

输入样例2:

2 1 7 4 1

输出样例2:

NONE

代码:

#include<stdio.h>

int fun1(int arr[][7],int i,int n)
{
    int j;
    int index=0;
    for(j=1;j<n;j++)
    {
        if(arr[i][j]>=arr[i][index]) index=j;
    }
    return index;
}

int fun2(int arr[][7],int i,int n)
{
    int j;
    int index=0;
    for(j=1;j<n;j++)
    {
        if(arr[j][i]<=arr[index][i]) index=j;
    }
    return index;
}
int main()
{
   int n;
   scanf("%d",&n);
   int arr[7][7];
   int i,j;
   for(i=0;i<n;i++)
   {
       for(j=0;j<n;j++)
       {
           scanf("%d",&arr[i][j]);
       }
   }
   int l=0;
   int temp1,temp2;
   for(i=0;i<n;i++)
   {
       temp1=fun1(arr,i,n);
       temp2=fun2(arr,temp1,n);
       if(arr[i][temp1]==arr[temp2][temp1])
       {
           l=1;break;
       }
   }
   if(l==1) printf("%d %d\n",temp2,temp1);
   else printf("NONE\n");
   return 0;
}

45、练习5-1 求m到n之和

本题要求实现一个计算m~n(m<n)之间所有整数的和的简单函数。

函数接口定义:

int sum( int m, int n );

其中m和n是用户传入的参数,保证有m<n。函数返回的是m~n之间所有整数的和。

裁判测试程序样例:

#include <stdio.h>

int sum(int m, int n);

int main()
{    
    int m, n;

    scanf("%d %d", &m, &n);
    printf("sum = %d\n", sum(m, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

-5 8

输出样例:

sum = 21

代码:

int sum(int m, int n)
{
    int i;
    int sum=0;
    for(i=m;i<=n;i++)
    {
        sum=sum+i;
    }
    return sum;
}

46、练习5-2 找两个数中最大者

本题要求对两个整数a和b,输出其中较大的数。

函数接口定义:

int max( int a, int b );

其中a和b是用户传入的参数,函数返回的是两者中较大的数。

裁判测试程序样例:

#include <stdio.h>

int max( int a, int b );

int main()
{    
    int a, b;

    scanf("%d %d", &a, &b);
    printf("max = %d\n", max(a, b));

    return 0;
}

/* 你的代码将被嵌在这里 */ 输入样例:

-5 8

输出样例:

max = 8

代码:

int max( int a, int b )
{
  if(a>=b)return a;
  else return b;
}

47、练习5-3 数字金字塔

本题要求实现函数输出n行数字金字塔。

函数接口定义:

void pyramid( int n );

其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行数字金字塔。注意每个数字后面跟一个空格。

裁判测试程序样例:

#include <stdio.h>

void pyramid( int n );

int main()
{    
    int n;

    scanf("%d", &n);
    pyramid(n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

5

输出样例:

1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

代码:

void pyramid( int n )
{
    int i;
    int temp=n;
    for(i=1;i<=n;i++)
    {
        int j=1;
        for(;j<temp;j++)
            printf(" ");
        for(j=1;j<=i;j++)
        {
            printf("%d ",i);
        }
        printf("\n");
        temp--;
    }
}

48、习题5-1 符号函数

本题要求实现符号函数sign(x)。

函数接口定义:

int sign( int x );

其中x是用户传入的整型参数。符号函数的定义为:若x大于0,sign(x) = 1;若x等于0,sign(x) = 0;否则,sign(x) = −1。

裁判测试程序样例:

#include <stdio.h>

int sign( int x );

int main()
{
    int x;

    scanf("%d", &x);
    printf("sign(%d) = %d\n", x, sign(x));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

10

输出样例:

sign(10) = 1

代码:

int sign( int x )
{
  if(x>0) return 1;
  else if(x==0) return 0;
  else return -1;
}

49、习题5-2 使用函数求奇数和

本题要求实现一个函数,计算N个整数中所有奇数的和,同时实现一个判断奇偶性的函数。

函数接口定义:

int even( int n ); int OddSum( int List[], int N );

其中函数even将根据用户传入的参数n的奇偶性返回相应值:当n为偶数时返回1,否则返回0。函数OddSum负责计算并返回传入的N个整数List[]中所有奇数的和。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

int even( int n );
int OddSum( int List[], int N );

int main()
{    
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    printf(") = %d\n", OddSum(List, N));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6 2 -3 7 88 0 15

输出样例:

Sum of ( -3 7 15 ) = 19

代码:

int even( int n )
{
  if(n%2==0) return 1;
  else return 0;
}

int OddSum( int List[], int N )
{
  int i;
  int sum=0;
  for(i=0;i<N;i++)
  {
    if(List[i]%2!=0) sum+=List[i];
  }
  return sum;
}

50、习题5-3 使用函数计算两点间的距离

本题要求实现一个函数,对给定平面任意两点坐标(x1 ,y​1 )和(x2 ,y2),求这两点之间的距离。

函数接口定义:

double dist( double x1, double y1, double x2, double y2 );

其中用户传入的参数为平面上两个点的坐标(x1, y1)和(x2, y2),函数dist应返回两点间的距离。

裁判测试程序样例:

#include <stdio.h>
#include <math.h>

double dist( double x1, double y1, double x2, double y2 );

int main()
{    
    double x1, y1, x2, y2;

    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    printf("dist = %.2f\n", dist(x1, y1, x2, y2));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

10 10 200 100

输出样例:

dist = 210.24

代码:

double dist( double x1, double y1, double x2, double y2 )
{
  return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

51、习题5-4 使用函数求素数和

本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。

素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:

int prime( int p ); int PrimeSum( int m, int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数m≤n。

裁判测试程序样例:

#include <stdio.h>
#include <math.h>

int prime( int p );
int PrimeSum( int m, int n );

int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
        if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

-1 10

输出样例:

Sum of ( 2 3 5 7 ) = 17

代码:

int prime( int p )
{
  if(p<2) return 0;
  else
  {
     int i;
     int l=1;
     for(i=2;i<=sqrt(p);i++)
     {
       if(p%i==0)
       {
         l=0;
         break;
       }
     }
     return l;
  }
}
int PrimeSum( int m, int n )
{
  int sum=0;
  int i;
  for(i=m;i<=n;i++)
  {
    int temp=prime(i);
    if(temp==1) sum+=i;
  }
  return sum;
}

52、习题5-5 使用函数统计指定数字的个数

本题要求实现一个统计整数中指定数字的个数的简单函数。

函数接口定义:

int CountDigit( int number, int digit );

其中number是不超过长整型的整数,digit为[0, 9]区间内的整数。函数CountDigit应返回number中digit出现的次数。

裁判测试程序样例:

#include <stdio.h>

int CountDigit( int number, int digit );

int main()
{
    int number, digit;

    scanf("%d %d", &number, &digit);
    printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

-21252 2

输出样例:

Number of digit 2 in -21252: 3

代码:

int CountDigit( int number, int digit )
{
 if(number<0) number=-number;
 if(number==0&&digit==0) return 1;
  else
  {
    int tt=0;
    while(number)
    {
      int temp=number%10;
      if(temp==digit) tt++;
      number/=10;
    }
    return tt;
  }
}

53、习题5-6 使用函数输出水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+3​3。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。

函数接口定义:

int narcissistic( int number ); void PrintN( int m, int n );

函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。

函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。

裁判测试程序样例:

#include <stdio.h>

int narcissistic( int number );
void PrintN( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
    PrintN(m, n);
    if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

153 400

输出样例:

153 is a narcissistic number 370 371

代码:

int narcissistic( int number )
{
  int nu=number;
  int temp=0;
  while(nu)
  {
    nu/=10;
    temp++;
  }
  nu=number;
  int sum=0;
  int index;
  while(number)
  {
    int i;
    int t=number%10;
    index=1;
    for(i=1;i<=temp;i++)
     index*=t;
    sum+=index;
    number/=10;
  }
  if(sum==nu) return 1;
  else return 0;
}
void PrintN( int m, int n )
{
  int i;
  for(i=m+1;i<n;i++)
  {
     int temp=narcissistic(i);
     if(temp==1) printf("%d\n",i);
  }
}

54、习题5-7 使用函数求余弦函数的近似值

本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:cos(x)=x0 /0!−x​2 /2!+x4 /4!−x6 /6!+⋯

函数接口定义:

double funcos( double e, double x );

其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。

裁判测试程序样例:

#include <stdio.h>
#include <math.h>

double funcos( double e, double x );

int main()
{    
    double e, x;

    scanf("%lf %lf", &e, &x);
    printf("cos(%.2f) = %.6f\n", x, funcos(e, x));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

0.01 -3.14

输出样例:

cos(-3.14) = -0.999899

代码:

double funcos( double e, double x )
{
    int i,j;
    double temp1;
    double temp2;
    double temp;
    double sum=0;
    int l=1;
    for(i=0;;i+=2)
    {
        if(i==0)
        {
           temp=1.0;
        }
        else
        {
            temp1=1;
            temp2=1;
            for(j=1;j<=i;j++)
            {
                temp1*=x;
                temp2*=j;
            }
            temp=temp1/temp2;
        }
          sum+=(temp*l);
        if(temp<e) break;

        l=-l;

    }
    return sum;
}

55、习题4-8 高空坠球

皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

输入格式:

输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:

在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

输入样例:

33 5

输出样例:

94.9 1.0

代码:

#include<stdio.h>
int main()
{
    double h;
    int n;
    scanf("%lf %d",&h,&n);
    int i;
    double sum=h;
    if(n==0)
    {
        printf("0.0 0.0\n");
    }
    else{
         for(i=1;i<=n-1;i++)
          {
            if(h==0) break;
            h=h/2.0;
            sum=sum+h+h;
          }
          printf("%.1lf %.1lf\n",sum,h/2);
      }
      return 0;
}

56、习题4-10 猴子吃桃问题

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:

输入在一行中给出正整数N(1<N≤10)。

输出格式:

在一行中输出第一天共摘了多少个桃子。

输入样例:

3

输出样例:

10

代码:

#include<stdio.h>
int main()
{
    int N;
    scanf("%d",&N);
    int i;
    int t=1;
    for(i=N;i>1;i--)
    {
        t=(t+1)*2;

    }
    printf("%d\n",t);
}

57、习题6-8 统计一行文本的单词个数

本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:

输入给出一行字符。

输出格式:

在一行中输出单词个数。

输入样例:

Let’s go to room 209.

输出样例:

5

代码:

#include<stdio.h>
int main()
{
    char str[1000];
    gets(str);
    int i,j;
    int len=strlen(str);
    i=0;
    j=len-1;
    while(str[i]==' ')
    {
        i++;
    }
    while(str[j]==' ')
    {
        j--;
    }
    if(i==len&&j<0) printf("0\n");
    else{
    int n1=i;
    int n2=j;
    int temp=0;
    int l=0;
    for(i=n1+1;i<=n2;i++)
    {
       if(str[i]==' '&&str[i-1]!=' ') {l=1;temp++;}
    }
   printf("%d\n",temp+1);}
    return 0;
}

58、练习7-2 求最大值及其下标

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

输入格式:

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

输出格式:

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

输入样例:

6 2 8 10 1 9 10

输出样例:

10 2

代码:

#include<stdio.h>
#include<math.h>
int main()
{
  int n;
  int a[100];
  scanf("%d\n",&n);
  int i;
  for(i=0;i<n;i++)
    scanf("%d\,",&a[i]);
  int j;
  int index;
  index=0;
  for(i=1;i<n;i++)
  {
      if(a[i]>a[index]) index=i;

  }
  printf("%d %d\n",a[index],index);
}

59、练习7-3 将数组中的数逆序存放

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

输入格式:

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

输出格式:

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

输入样例:

4 10 8 1 2

输出样例:

2 1 8 10

代码:

#include<stdio.h>
int main()
{
    int arr[11];
    int n;
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
        scanf("%d",&arr[i]);

    for(i=0;i<n/2;i++)
    {
        int t=arr[i];
        arr[i]=arr[n-1-i];
        arr[n-1-i]=t;
    }
   // arr[n-1]=t;
    for(i=0;i<n;i++)
    {
        if(i==n-1) printf("%d\n",arr[i]);
        else printf("%d ",arr[i]);
    }
    return 0;
}

60、练习7-4 找出不是两个数组共有的元素

给定两个整型数组,本题要求找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例:

10 3 -5 2 8 0 3 5 -15 9 100 11 6 4 8 2 6 -5 9 0 100 8 1

输出样例:

3 5 -15 6 4 1

代码:

#include<stdio.h>
int temp[100];
int tt=0;
void fun(int arr[][22],int n1,int n2)
{
    int i,j;
    int l;
    for(i=0;i<n1;i++)
    {
      int l=1;
      for(j=0;j<n2;j++)
      {
          if(arr[0][i]==arr[1][j]){l=0;break;}
      }
      if(l==1) temp[tt++]=arr[0][i];
    }
    for(i=0;i<n2;i++)
    {
      int l=1;
      for(j=0;j<n1;j++)
      {
          if(arr[1][i]==arr[0][j]){l=0;break;}
      }
      if(l==1) temp[tt++]=arr[1][i];
    }
}
int main()
{
    int arr[2][22];
    int N;
    int i,k;
    int n1,n2;
    for(k=0;k<2;k++)
    {
        scanf("%d",&N);
        if(k==0) n1=N;
        else n2=N;
        for(i=0;i<N;i++)
        {
           scanf("%d",&arr[k][i]);
        }
    }
    fun(&arr,n1,n2);
    int j;
    int l;
    for(i=0;i<tt-1;i++)
    {
        for(j=i+1;j<tt;j++)
        {
            if(temp[j]==temp[i])temp[j]=-999999;
        }
    }
    for(i=0;i<tt;i++)
    {
        if(temp[i]!=-999999)
        {
            if(i==0) printf("%d",temp[i]);
            else printf(" %d",temp[i]);
        }
    }
    printf("\n");
    return 0;
}

61、练习7-7 矩阵运算

给定一个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;
    int arr[11][11];
    scanf("%d",&n);
    int i,j;
    int sum=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
            sum+=arr[i][j];   //全部数据相加
        }
    }
    for(i=0;i<n;i++)
    {
        sum-=arr[i][n-1];  //减去最后一列
        sum-=arr[n-1][i];  //减去最后一行
    }
    sum+=arr[n-1][n-1];   //元素arr[n-1][n-1]被减两次,因此加一次
    int l=n-1;
    for(i=0;i<n;i++)
    {
        sum-=arr[i][l];   //减去副对角线上的元素
        l--;
    }
    sum+=arr[0][n-1];    //元素arr[0][n-1]被减两次,因此加一次
    sum+=arr[n-1][0];    //元素arr[n-1][0]被减两次,因此加一次
    printf("%d\n",sum);
    return 0;
}

62、练习7-8 方阵循环右移

本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入格式:

输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

输出格式:

按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

输入样例:

2 3 1 2 3 4 5 6 7 8 9

输出样例:

2 3 1 5 6 4 8 9 7

代码:

#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    int i,j;
    int arr[7][7];
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    int k;
    int index;
    for(k=1;k<=m;k++)
    {
        for(i=0;i<n;i++)
        {
            index=arr[i][n-1];
            for(j=n-1;j>0;j--)
            {
                arr[i][j]=arr[i][j-1];
            }
            arr[i][j]=index;
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
           printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

63、习题6-1 分类统计字符个数

本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。

函数接口定义:

void StringCount( char s[] );

其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 15

void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

/* Your function will be put here */

输入样例:

aZ & 09 Az

输出样例:

letter = 4, blank = 3, digit = 2, other = 1

代码:

void StringCount( char s[] )
{
    int i;
    int letter=0;
    int blank=0;
    int digit=0;
    int other=0;
    for(i=0;i<strlen(s);i++)
    {
       if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z') letter++;
       else if(s[i]==' '||s[i]=='\n') blank++;
       else if(s[i]>='0'&&s[i]<='9') digit++;
       else other++;
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d\n",letter,blank,digit,other);
}

64、习题6-2 使用函数求特殊a串数列和

给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。

函数接口定义:

int fn( int a, int n ); int SumA( int a, int n );

其中函数fn须返回的是n个a组成的数字;SumA返回要求的和。

裁判测试程序样例:

#include <stdio.h>

int fn( int a, int n );
int SumA( int a, int n );
	
int main()
{
    int a, n;

    scanf("%d %d", &a, &n);
    printf("fn(%d, %d) = %d\n", a, n, fn(a,n));		
    printf("s = %d\n", SumA(a,n));	
	
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 3

输出样例:

fn(2, 3) = 222 s = 246

代码:

int fn( int a, int n )
{
  int i;
  int sum=0;
  for(i=1;i<=n;i++)
  {
    sum*=10;
    sum+=a;
  }
  return sum;
}
int SumA( int a, int n )
{
  int i,j;
  int sum=0;
  int t;
  for(i=1;i<=n;i++)
  {
     t=0;
     for(j=1;j<=i;j++)
     {
        t*=10;
        t+=a;
     }
     sum+=t;
  }
  return sum;
}

65、习题6-4 使用函数输出指定范围内的Fibonacci数

本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

函数接口定义:

int fib( int n ); void PrintFN( int m, int n );

其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。

裁判测试程序样例:

#include <stdio.h>

int fib( int n );
void PrintFN( int m, int n );
	
int main()
{
    int m, n, t;

    scanf("%d %d %d", &m, &n, &t);
    printf("fib(%d) = %d\n", t, fib(t));
    PrintFN(m, n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

20 100 7

输出样例1:

fib(7) = 13 21 34 55 89

输入样例2:

2000 2500 8

输出样例2:

fib(8) = 21 No Fibonacci number

代码:

int fib( int n )
{
    int a=1;
    int b=1;
    if(n==1||n==2) return 1;
    else
    {
       int c;
       int temp=2;
       while(1)
        {
          c=a+b;
          temp++;
          a=b;
          b=c;
          if(temp>=n) break;
        }
        return c;
    }

}
void PrintFN( int m, int n )
{
    int i;
    int arr[100];
    int tt=0;
    for(i=1;;i++)
    {
        int temp=fib(i);
        if(temp>=m&&temp<=n)
        {
           arr[tt++]=temp;
        }
        if(temp>n) break;
    }
    if(tt==0) printf("No Fibonacci number\n");
    else
    {
        for(i=0;i<tt;i++)
         {
            if(i==tt-1) printf("%d\n",arr[i]);
            else printf("%d ",arr[i]);
         }
    }
}

66、习题6-5 使用函数验证哥德巴赫猜想

本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:

int prime( int p ); void Goldbach( int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。

裁判测试程序样例:

 #include <stdio.h>
 #include <math.h>
 
 int prime( int p ); void Goldbach( int n );
 
 int main() {
     int m, n, i, cnt;
 
     scanf("%d %d", &m, &n);
     if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
     if ( m < 6 ) m = 6;
    if ( m%2 ) m++;
     cnt = 0;
     for( i=m; i<=n; i+=2 ) {
         Goldbach(i);
         cnt++;
         if ( cnt%5 ) printf(", ");
         else printf("\n");
     }
 
     return 0; }
 
 /* 你的代码将被嵌在这里 */

输入样例:

89 100

输出样例:

89 is a prime number 90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79 100=3+97,

代码:

int prime( int p )
{
    if(p<2) return 0;
    else{
    int i;
    int n=p;
    int l=1;
    for(i=2;i<=sqrt(p);i++)
    {
        if(n%i==0)
        {
            l=0;break;
        }
    }
    return l;}
}
void Goldbach( int n )
{
    int i;
    int temp;
    for(i=2;;i++)
    {
       temp=prime(i);
       if(temp==1)
       {
           int tt=n-i;
           if(prime(tt)) {printf("%d=%d+%d",n,i,tt);break;}
       }
    }
}

67、习题6-6 使用函数输出一个整数的逆序数

本题要求实现一个求整数的逆序数的简单函数。

函数接口定义:

int reverse( int number );

其中函数reverse须返回用户传入的整型number的逆序数。

裁判测试程序样例:

#include <stdio.h>

int reverse( int number );

int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", reverse(n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

-12340

输出样例:

-4321

代码:

int reverse( int number )
{
    int l=1;
    if(number<0) {l=-1;number=-number;}
    int sum=0;
    int temp;
    while(number)
    {
       temp=number%10;
       sum=sum*10+temp;
       number/=10;
    }
    sum*=l;
    return sum;
}

68、练习8-2 计算两数的和与差

本题要求实现一个计算输入的两数的和与差的简单函数。

函数接口定义:

void sum_diff( float op1, float op2, float *psum, float *pdiff );

其中op1和op2是输入的两个实数,psum和pdiff是计算得出的和与差。

裁判测试程序样例:

#include <stdio.h>

void sum_diff( float op1, float op2, float *psum, float *pdiff );

int main()
{
    float a, b, sum, diff;

    scanf("%f %f", &a, &b);
    sum_diff(a, b, &sum, &diff);
    printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
	
    return 0; 
}

/* 你的代码将被嵌在这里 */

输入样例:

4 6

输出样例:

The sum is 10.00 The diff is -2.00

参考代码:

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
  *psum=op1+op2;
  *pdiff=op1-op2;
}

69、练习7-9 计算天数

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62

代码:

#include<stdio.h>

int fun(int yy,int mm)
{
    int temp=0;
    int sum=0;
    if((yy%4==0&&yy%100!=0)||(yy%400==0)) temp=1;
    int arr[13]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(temp==1) arr[1]=29;
    int i;
    for(i=0;i<mm-1;i++)
    {
        sum+=arr[i];
    }
    return sum;
}
int main()
{
    int yyyy; //年
    int mm;  //月
    int dd;  //日
    scanf("%d/%d/%d",&yyyy,&mm,&dd);
    int temp=fun(yyyy,mm);
    printf("%d\n",temp+dd);
    return 0;

}

70、练习7-10 查找指定字符

本题要求编写程序,从给定字符串中查找某指定的字符。

输入格式:

输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。

输出格式:

如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。

输入样例1:

m programming

输出样例1:

index = 7

输入样例2:

a 1234

输出样例2:

Not Found

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    char c;
    char str[81];
    scanf("%c",&c);
    getchar();
    gets(str);
    //printf("c==%c\n",c);
    //puts(str);
    int len=strlen(str);
    int i;
    int l=0;
    for(i=len-1;i>=0;i--)
    {
        if(str[i]==c)
        {
            l=1;break;
        }
    }
    if(l==0)printf("Not Found\n");
    else printf("index = %d\n",i);
    return 0;
}

71、练习7-11 字符串逆序

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:

在一行中输出逆序后的字符串。

输入样例:

Hello World!

输出样例:

!dlroW olleH

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    char str[81];
    gets(str);
    int len=strlen(str);
    int i;
    for(i=len-1;i>=0;i--)
    {
        printf("%c",str[i]);
    }
    printf("\n");
    return 0;
}

72、习题7-1 选择法排序

本题要求将给定的n个整数从大到小排序后输出。

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

4 5 1 7 6

输出样例:

7 6 5 1

代码:

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

73、习题7-2 求一批整数中出现最多的个位数字

给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。

输入格式:

输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。

输出格式:

在一行中按格式“M: n1 n2 …”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。

输入样例:

3 1234 2345 3456

输出样例:

3: 3 4

代码:

#include<stdio.h>

void fun(int*arr,int temp)
{
    while(temp)
    {
        arr[temp%10]++;
        temp/=10;
    }
}
int main()
{
    int N;
    scanf("%d",&N);
    int i;
    int temp;
    int arr[10]={0};
    for(i=0;i<N;i++)
    {
        scanf("%d",&temp);
        fun(&arr,temp);
    }
    int index=0;
    for(i=1;i<10;i++)
    {
        if(arr[i]>=arr[index]) index=i;
    }
    printf("%d:",arr[index]);
    for(i=0;i<10;i++)
    {
        if(arr[i]==arr[index]) printf(" %d",i);
    }
    return 0;
}

74、练习8-8 移动字母

本题要求编写函数,将输入字符串的前3个字符移到最后。

函数接口定义:

void Shift( char s[] );

其中char s[]是用户传入的字符串,题目保证其长度不小于3;函数Shift须将按照要求变换后的字符串仍然存在s[]里。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXS 10

void Shift( char s[] );

void GetString( char s[] ); /* 实现细节在此不表 */

int main()
{
    char s[MAXS];

    GetString(s);
    Shift(s);
    printf("%s\n", s);
	
    return 0; 
}

/* 你的代码将被嵌在这里 */

输入样例:

abcdef

输出样例:

defabc

代码:

void Shift( char s[] )
{
  int len=strlen(s);
  if(len==3) ;
  else
  {
      int i;
      char str[100];
      int t=0;
      for(i=0;i<3;i++)
      {
          str[i]=s[i];
      }
      for(i=3;i<len;i++)
      {
          s[t++]=s[i];
      }
      for(i=0;i<3;i++)
      {
          s[t++]=str[i];
      }
  }
}

75、习题8-1 拆分实数的整数与小数部分

本题要求实现一个拆分实数的整数与小数部分的简单函数。

函数接口定义:

void splitfloat( float x, int *intpart, float *fracpart );

其中x是被拆分的实数(0≤x<10000),intpart和fracpart分别是将实数x拆分出来的整数部分与小数部分。

裁判测试程序样例:

#include <stdio.h>

void splitfloat( float x, int *intpart, float *fracpart );

int main()
{
    float x, fracpart;
    int intpart;

    scanf("%f", &x);
    splitfloat(x, &intpart, &fracpart);
    printf("The integer part is %d\n", intpart);
    printf("The fractional part is %g\n", fracpart);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2.718

输出样例:

The integer part is 2 The fractional part is 0.718

代码:

void splitfloat( float x, int *intpart, float *fracpart )
{
  *intpart=(int)x;
  *fracpart=x-(int)x;
}

76、习题7-3 判断上三角矩阵

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

输入格式:

输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

输入样例:

2 3 1 2 3 0 4 5 0 0 6 2 1 0 -8 2

输出样例:

YES NO

代码:

#include<stdio.h>

int fun(int arr[][11],int n)
{
    int i,j;
    int l=1;
    for(i=1;i<n;i++)
    {
        for(j=0;j<i;j++)
        {
            if(arr[i][j]!=0){l=0;break;}
        }
        if(l==0) break;
    }
    return l;

}
int main()
{
    int T,n;
    scanf("%d",&T);
    int t,i,j;
    int k=0;
    int arr[11][11];
    int temp[11];
    for(t=1;t<=T;t++)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&arr[i][j]);
            }
        }
        int t=fun(&arr,n);
        temp[k++]=t;
    }
    for(i=0;i<k;i++)
        if(temp[i]==1)printf("YES\n");
    else printf("NO\n");
    return 0;
}

77、习题7-4 求矩阵各行元素之和

本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

输入格式:

输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间

以空格分隔。

输出格式:

每行输出对应矩阵行元素之和。

输入样例:

3 2 6 3 1 -8 3 12

输出样例:

9 -7 15

代码:

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

78、习题7-6 统计大写辅音字母

英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出格式:

输出在一行中给出字符串中大写辅音字母的个数。

输入样例:

HELLO World!

输出样例:

4

代码:

#include<stdio.h>
int main()
{
    char str[81];
    gets(str);
    int len=strlen(str);
    int i;
    int temp=0;
    for(i=0;i<len;i++)
    {
        if(str[i]>='A'&&str[i]<='Z')
        {
            if(str[i]!='A'&&str[i]!='E'&&str[i]!='I'&&str[i]!='O'&&str[i]!='U')
                temp++;
        }
    }
    printf("%d\n",temp);
    return 0;
}

79、习题3-5 三角形判断

给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。

输入格式:

输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x​1、y1、x2、y2、x3、y3。

输出格式:

若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。

输入样例1:

4 5 6 9 7 8

输出样例1:

L = 10.13, A = 3.00

输入样例2:

4 6 8 12 12 18

输出样例2:

Impossible

代码:

#include<stdio.h>
#include<math.h>
double fun(double x1,double y1,double x2,double y2)
{
    double temp1=x1-x2;
    double temp2=y1-y2;
    return sqrt(temp1*temp1+temp2*temp2);
}
int main()
{
    double x1,y1;
    double x2,y2;
    double x3,y3;
    scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
    double lon1=fun(x1,y1,x2,y2);
    double lon2=fun(x2,y2,x3,y3);
    double lon3=fun(x3,y3,x1,y1);
    if(lon1+lon2>lon3&&lon1+lon3>lon2&&lon2+lon3>lon1)
    {
        double p=(lon1+lon2+lon3)/2.0;
        double A=sqrt(p*(p-lon1)*(p-lon2)*(p-lon3));
        printf("L = %.2lf, A = %.2lf\n",lon1+lon2+lon3,A);
    }
    else printf("Impossible\n");
    return 0;
}
//定义:x1,y1,----x3,y3时,类型double int 出错

80、练习4-3 求给定精度的简单交错序列部分和

本题要求编写程序,计算序列部分和 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>
int main()
{
    double exp;
    scanf("%lf",&exp);
    int i;
    int l=1;
    double sum=0;
    double t;
    for(i=1;;i+=3)
    {
        t=1.0/i*l;
        sum+=t;
        if(fabs(t)<=exp) break;
        l=-l;
    }
    printf("sum = %.6lf\n",sum);
    return 0;
}

81、习题7-7 字符串替换

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

原字母

对应字母

A

Z

B

Y

C

X

D

W

X

C

Y

B

Z

A

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出格式:

输出在一行中给出替换完成后的字符串。

输入样例:

Only the 11 CAPItaL LeTtERS are replaced.

输出样例:

Lnly the 11 XZKRtaO OeGtVIH are replaced.

注: 编程重点

A+Z=155 B+Y=155 C+X=155 D+W=155 … … X+C=155 Y+B=155 Z+A=155

代码:

#include<stdio.h>

// A+Z=155
// B+Y=155
// ......
int main()
{
    char str[81];
    gets(str);
    int i;
    for(i=0;i<strlen(str);i++)
    {
        if(str[i]>='A'&&str[i]<='Z')
        {
            str[i]=155-str[i];
        }
    }
    puts(str);
}

82、习题8-10 输出学生成绩

本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。

输入格式:

输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。

输出格式:

按照以下格式输出:

average = 平均成绩 max = 最高成绩 min = 最低成绩

结果均保留两位小数。

输入样例:

3 85 90 95

输出样例:

average = 90.00 max = 95.00 min = 85.00

代码:

#include<stdio.h>

double fun(int *arr,int n,int l)
{
    int i;
    int index=0;
    for(i=1;i<n;i++)
    {
        if(l==1)
        {
            if(arr[i]>=arr[index]) index=i;
        }
        else
        {
            if(arr[i]<=arr[index]) index=i;
        }
    }
    return arr[index]/1.0;
}
int main()
{
    int N;
    int arr[10000];
    scanf("%d",&N);
    int i;
    int sum=0;
    for(i=0;i<N;i++)
    {
        scanf("%d",&arr[i]);
        sum+=arr[i];
    }
    printf("average = %.2lf\n",sum/(double)N);
    printf("max = %.2lf\n",fun(&arr,N,1));
    printf("min = %.2lf\n",fun(&arr,N,2));
    return 0;

}

83、习题8-2 在数组中查找指定元素

本题要求实现一个在数组中查找指定元素的简单函数。

函数接口定义:

int search( int list[], int n, int x );

其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到

则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

int search( int list[], int n, int x );

int main()
{
    int i, index, n, x;
    int a[MAXN];

    scanf("%d", &n);
    for( i = 0; i < n; i++ )
        scanf("%d", &a[i]);
    scanf("%d", &x);
    index = search( a, n, x );
    if( index != -1 )
        printf("index = %d\n", index);
    else
        printf("Not found\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

5 1 2 2 5 4 2

输出样例1:

index = 1

输入样例2:

5 1 2 2 5 4 0

输出样例2:

Not found

代码:

int search( int list[], int n, int x )
{
  int i;
  int l=-1;
  for(i=0;i<n;i++)
  {
    if(list[i]==x){l=1;break;}
  }
  if(l==1) return i;
  else return l;
}

84、习题8-3 数组循环右移

本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a​0 ​​ a1⋯a​n−1)变换为( a​n−m⋯a​n−1a0a1⋯an−m−1 )(最后m个数循环移最前面的m个位置)。

函数接口定义:

int ArrayShift( int a[], int n, int m );

其中 a[] 是用户传入的数组;n是数组的大小;m是右移的位数。函数 ArrayShift 须将循环右移后的数组仍然存在a[]中。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6 2 1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

代码:

int ArrayShift( int a[], int n, int m )
{
  int i;
  int k;
  for(k=1;k<=m;k++)
  {
    int temp=a[n-1];
    for(i=n-1;i>0;i--)
     {
        a[i]=a[i-1];
     }
     a[0]=temp;
  }
}

85、题8-9 分类统计各类字符个数

本题要求实现一个函数,统计给定字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。

函数接口定义:

void StringCount( char *s );

其中 char *s 是用户传入的字符串。函数 StringCount 须在一行内按照

大写字母个数 小写字母个数 空格个数 数字个数 其它字符个数

的格式输出。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 15

void StringCount( char *s );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

/* Your function will be put here */

输入样例:

aZ&*? 093 Az

输出样例:

2 2 1 3 4

代码:

void StringCount( char *s )
{
    int suma=0;   //小写字母个数
    int sumA=0;   //大写字母个数
    int sum_=0;   //空格个数
    int sum1=0;   //数字个数
   // int sumO=0;
    int i;
    int len=strlen(s);
    for(i=0;i<len;i++)
    {
       
        if(s[i]>='A'&&s[i]<='Z') sumA++;
        if(s[i]>='a'&&s[i]<='z') suma++;
        if(s[i]==' ') sum_++;
        if(s[i]>='0'&&s[i]<='9') sum1++;
    
    }
    printf("%d %d %d %d %d\n",sumA,suma,sum_,sum1,len-(suma+sumA+sum_+sum1));
}

86、习题9-2 计算两个复数之积

本题要求实现一个计算复数之积的简单函数。

函数接口定义:

struct complex multiply(struct complex x, struct complex y);

其中 struct complex 是复数结构体,其定义如下:

struct complex{ int real; int imag; };

裁判测试程序样例:

#include <stdio.h>

struct complex{
    int real;
    int imag;
};

struct complex multiply(struct complex x, struct complex y);

int main()
{
    struct complex product, x, y;

    scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
    product = multiply(x, y);
    printf("(%d+%di) * (%d+%di) = %d + %di\n", 
            x.real, x.imag, y.real, y.imag, product.real, product.imag);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

3 4 5 6

输出样例:

(3+4i) * (5+6i) = -9 + 38i

代码:

struct complex multiply(struct complex x, struct complex y)
{
    struct complex t;
    t.real=x.real*y.real-x.imag*y.imag;
    t.imag=x.real*y.imag+y.real*x.imag;
    return t;
};

87、习题9-6 按等级统计学生成绩

本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。

函数接口定义:

int set_grade( struct student *p, int n );

其中 p 是指向学生信息的结构体数组的指针,该结构体的定义为:

struct student{ int num; char name[20]; int score; char grade; };

n 是数组元素个数。学号 num 、姓名 name 和成绩 score 均是已经存储好的。 set_grade 函数需要根据学生的成绩 score 设置其等级 grade 。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时, set_grade 还需要返回不及格的人数。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

10 31001 annie 85 31002 bonny 75 31003 carol 70 31004 dan 84 31005 susan 90 31006 paul 69 31007 pam 60 31008 apple 50 31009 nancy 100 31010 bob 78

输出样例:

The count for failed (<60): 1 The grades: 31001 annie A 31002 bonny B 31003 carol B 31004 dan B 31005 susan A 31006 paul C 31007 pam C 31008 apple D 31009 nancy A 31010 bob B

代码:

int set_grade( struct student *p, int n )
{
    int i;
    int temp=0;
    for(i=0;i<n;i++)
    {
        if(p[i].score>=85&&p[i].score<=100) p[i].grade='A';
        if(p[i].score>=70&&p[i].score<=84) p[i].grade='B';
        if(p[i].score>=60&&p[i].score<=69) p[i].grade='C';
        if(p[i].score>=0&&p[i].score<=59) {p[i].grade='D';temp++;}
    }
    return temp;
}

88、习题11-1 输出月份英文名

本题要求实现函数,可以返回一个给定月份的英文名称。

函数接口定义:

char *getmonth( int n );

函数 getmonth 应返回存储了 n 对应的月份英文名称的字符串头指针。如果传入的参数 n 不是一个代表月份的数字,则返回空指针NULL。

裁判测试程序样例:

#include <stdio.h>

char *getmonth( int n );

int main()
{
    int n;
    char *s;

    scanf("%d", &n);
    s = getmonth(n);
    if ( s==NULL ) printf("wrong input!\n");
    else printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

5

输出样例1:

May

输入样例2:

15

输出样例2:

wrong input!

代码:

char *getmonth( int n )
{

    if(n>12||n<=0) return NULL;
    else
    {
       if(n==1) return "January";
       if(n==2) return "February";
       if(n==3) return "March";
       if(n==4) return "April";
       if(n==5) return "May";
       if(n==6) return "June";
       if(n==7) return "July";
       if(n==8) return "August";
       if(n==9) return "September";
       if(n==10) return "October";
       if(n==11) return "November";
       if(n==12) return "December";

    }
}

89、习题11-2 查找星期

本题要求实现函数,可以根据下表查找到星期,返回对应的序号。

序号

星期

0

Sunday

1

Monday

2

Tuesday

3

Wednesday

4

Thursday

5

Friday

6

Saturday

函数接口定义:

int getindex( char *s );

函数 getindex 应返回字符串 s 序号。如果传入的参数 s 不是一个代表星期的字符串,则返回-1。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXS 80

int getindex( char *s );

int main()
{
    int n;
    char s[MAXS];

    scanf("%s", s);
    n = getindex(s);
    if ( n==-1 ) printf("wrong input!\n");
    else printf("%d\n", n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

Tuesday

输出样例1:

2

输入样例2:

today

输出样例2:

wrong input!

代码:

int getindex( char *s )
{
    char str[8][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
    int i,j;
    int len=strlen(s);
    int l=-1;
    for(i=0;i<7;i++)
    {
        if(strcmp(s,str[i])==0)
        {
            l=1;break;
        }
    }
    if(l==1) return i;
    else return -1;
}

90、练习10-1 使用递归函数计算1到n之和

本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。

函数接口定义:

int sum( int n );

该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。

裁判测试程序样例:

#include <stdio.h>

int sum( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printf ("%d\n", sum(n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

10

输出样例1:

55

输入样例2:

0

输出样例2:

0

代码:

int sum( int n )
{
   if(n>0)
   {
     if(n==1) return 1;
     else return n+sum(n-1);
   }
   else return 0;
}

91、习题10-2 递归求阶乘和

本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+…+n! 的值。

函数接口定义:

double fact( int n ); double factsum( int n );

函数 fact 应返回 n 的阶乘,建议用递归实现。函数 factsum 应返回 1!+2!+…+ n! 的值。题目保证输入输出在双精度范围内。

裁判测试程序样例:

#include <stdio.h>

double fact( int n );
double factsum( int n );

int main()
{
    int n;

    scanf("%d",&n);
    printf("fact(%d) = %.0f\n", n, fact(n));
    printf("sum = %.0f\n", factsum(n));
		
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

10

输出样例1:

fact(10) = 3628800 sum = 4037913

输入样例2:

0

输出样例2:

fact(0) = 1 sum = 0

代码:

double fact( int n )
{
  if(n==1||n==0) return 1;
  else return n*fact(n-1);
}
double factsum( int n )
{
  int i;
  double sum=0;
  if(n==0) return 0;
  else
  {
    for(i=1;i<=n;i++)
    sum+=fact(i);
    return sum;
  }
}

92、习题8-5 使用函数实现字符串部分复制

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:

void strmcpy( char *t, int m, char *s );

函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20

void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char t[MAXN], s[MAXN];
    int m;

    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

7 happy new year

输出样例:

new year

代码:

void strmcpy( char *t, int m, char *s )
{
    int len=strlen(t);
    int i=0;
    if(m>len) *s=NULL;
    else
    {
        m=m-1;
        while(t[m]!='\0')
        {
            s[i++]=t[m];
            m++;
        }
        s[i]='\0';
    }
}

93、习题8-6 删除字符

本题要求实现一个删除字符串中的指定字符的简单函数。

函数接口定义:

void delchar( char *str, char c );

其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

a happy new year

输出样例:

hppy new yer

代码:

void delchar( char *str, char c )
{
    int len=strlen(str);
    char *strTemp=(char*)malloc(sizeof(char)*len);
    int i=0;
    int t=0;
    while(str[i]!='\0')
    {
       if(str[i]!=c) strTemp[t++]=str[i];
       i++;
    }
    strTemp[t]='\0';
    for(i=0;i<=t;i++)
        str[i]=strTemp[i];
}

94、习题8-8 判断回文字符串

本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。

函数接口定义:

bool palindrome( char *s );

函数palindrome判断输入字符串char *s是否为回文。若是则返回 true ,否则返回 false 。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
    char s[MAXN];

    scanf("%s", s);
    if ( palindrome(s)==true )
        printf("Yes\n");
    else
        printf("No\n");
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

thisistrueurtsisiht

输出样例1:

Yes thisistrueurtsisiht

输入样例2:

thisisnottrue

输出样例2:

No thisisnottrue

代码:

bool palindrome( char *s )
{
    int len=strlen(s);
    int i;
    int l=1;
    for(i=0;i<len/2;i++)
    {
        if(s[i]!=s[len-1-i])
        {
            l=0;
            break;
        }
    }
    if(l==1) return true;
    else return false;
}

95、习题10-3 递归实现指数函数

本题要求实现一个计算xn(n≥1)的函数。

函数接口定义:

double calc_pow( double x, int n );

函数 calc_pow 应返回 x 的 n 次幂的值。建议用递归实现。题目保证结果在双精度范围内。

裁判测试程序样例:

#include <stdio.h>

double calc_pow( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%.0f\n", calc_pow(x, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 3

输出样例:

8

代码:

double calc_pow( double x, int n )
{
  if(n==1) return x;
  else return x*calc_pow(x,n-1);
}

96、习题10-4 递归求简单交错幂级数的部分和

本题要求实现一个函数,计算下列简单交错幂级数的部分和:

f(x,n)=x−x​2+x​3​​ −x​4+⋯+(−1)​n−1xn

​​

函数接口定义:

double fn( double x, int n );

其中题目保证传入的n是正整数,并且输入输出都在双精度范围内。函数fn应返回上述级数的部分和。建议尝试用递归实现。

裁判测试程序样例:

#include <stdio.h>

double fn( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%.2f\n", fn(x,n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

0.5 12

输出样例:

0.33

代码:

double fn( double x, int n )
{
    if(n==1) return x;
    else return pow(-1,n-1)*pow(x,n)+fn(x,n-1);
}

97、习题10-5 递归计算Ackermenn函数

本题要求实现Ackermenn函数的计算,其函数定义如下:

函数接口定义:

int Ack( int m, int n );

其中 m 和 n 是用户传入的非负整数。函数 Ack 返回Ackermenn函数的相应值。题目保证输入输出都在长整型范围内。

裁判测试程序样例:

#include <stdio.h>

int Ack( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    printf("%d\n", Ack(m, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 3

输出样例:

9

代码:

int Ack( int m, int n )
{
    if(m==0) return n+1;
    else
    {
        if(n==0&&m>0) return Ack(m-1,1);
        if(n>0&&m>0) return Ack(m-1,Ack(m,n-1));
    }
}

98、习题10-6 递归求Fabonacci数列

本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:

f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。

函数接口定义:

int f( int n );

函数 f 应返回第 n 个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。

裁判测试程序样例:

#include <stdio.h>

int f( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", f(n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6

输出样例:

8

代码:

int f( int n )
{
    if(n==0||n==1) return n;
    //else if(n==1) return 1;
    else
    {
        return f(n-2)+f(n-1);
    }
}

99、习题10-7 十进制转换二进制

本题要求实现一个函数,将正整数n转换为二进制后输出。

函数接口定义:

void dectobin( int n );

函数 dectobin 应在一行中打印出二进制的 n 。建议用递归实现。

裁判测试程序样例:

#include <stdio.h>

void dectobin( int n );

int main()
{
    int n;

    scanf("%d", &n);
    dectobin(n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

10

输出样例:

1010

代码:

void dectobin( int n )
{
    if(n<2) printf("%d",n%2);
    else
    {
        dectobin(n/2);
        printf("%d",n%2);
    }
}

100、习题10-8 递归实现顺序输出整数

本题要求实现一个函数,对一个整数进行按位顺序输出。

函数接口定义:

void printdigits( int n );

函数 printdigits 应将 n 的每一位数字从高位到低位顺序打印出来,每位数字占一行。

裁判测试程序样例:

#include <stdio.h>

void printdigits( int n );

int main()
{
    int n;
	
    scanf("%d", &n);
    printdigits(n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

12345

输出样例:

1 2 3 4 5

代码:

void printdigits( int n )
{
    if(n<=10) printf("%d\n",n%10);
    else
    {   printdigits(n/10);
        printf("%d\n",n%10);

    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【阅读清单】系列文章清单列表(一)

    Centreon+Nagios实战 https://cloud.tencent.com/developer/inventory/272

    云加社区
  • 很多小伙伴问我推荐什么书籍和网课,这次把私藏很久的资料都贡献了(上)

    平时有不少读者朋友问,有没有学习书籍网上课程推荐?今天结合自己学习经历与身边几个朋友的经历总结了一份程序员相关的书籍和网课。

    C语言与CPP编程
  • 浙大版《C语言程序设计(第3版)》题目集 习题9-5 通讯录排序

    输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。

    C you again 的博客
  • 浙大版《C语言程序设计(第3版)》题目集 习题3-5 三角形判断

    给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。

    C you again 的博客
  • 我一 jiao 踹开了 C 语言的大门

    老读者都知道了,我妹今年上大一,学校安排的编程语言是 C 语言,这对于一个初学编程的小白来说,并不容易!作为她亲哥的我,肩膀上抗着巨大的责任,那就是尽全力帮助她...

    沉默王二
  • 浙大版《C语言程序设计(第3版)》题目集 习题7-3 判断上三角矩阵

    上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

    C you again 的博客
  • 浙大版《C语言程序设计(第3版)》题目集 练习5-1 求m到n之和

    C you again 的博客
  • C 语言与 C++ 学习路线、书籍、视频推荐和资料,值得收藏!

    C 语言是最接近计算机的语言,很多时间,我们都会发现,C 语言是非常有必要学习的。

    C语言与CPP编程
  • 浙大版《C语言程序设计(第3版)》题目集 练习2-3 输出倒三角图案

    C you again 的博客
  • 「算法与数据结构」从入门到进阶整理推荐书单

    小吴花了几天时间整理了一下学习「数据结构与算法」可以参考的书籍,希望能在学习的道路上帮到你,文末提供收集的PDF版。

    五分钟学算法
  • 浙大版《C语言程序设计(第3版)》题目集 习题10-1 判断满足条件的三位数

    本题要求实现一个函数,统计给定区间内的三位数中有两位数字相同的完全平方数(如144、676)的个数。

    C you again 的博客
  • 畅行全球20年,最值得拥有的殿堂级C++入门神作!!

    它融合了令全球无数程序员为之迷醉的C++大师Stanley B. Lippman的丰富实践经验,注入了C++标准委员会原负责人Josée Lajoie 对C++...

    博文视点Broadview
  • 刷了 1000 多道算法题,一点心得

    开个玩笑,其实,算法题目已经成为了公司筛人的一种方式,大厂的每一轮面试基本都会有几道算法题,甚至有的公司笔试全部都是算法题。其他题目答的都差不多,那你算法题做不...

    程序员鱼皮
  • 学习C++要读那些书

    加入编程界已经好几个年头了,也看了一些书,迷失过,总结过,绕过弯路,最后想想,就是因为开始没有指导性的意见。为了让后人不要重蹈覆辙,给大家推荐几本书,好好看看吧...

    程序员互动联盟
  • 如何用三个月搞定C语言

    C语言上个世纪七十年代诞生至今,已经度过了40多个春秋,在此期间经历多次的版本的更迭,目前市面上绝大部分语言的底层实现都是基于C语言,随着C语言之父的逝去,C语...

    程序员互动联盟
  • 零基础究竟怎样才可以学好C语言?多年开发老司机告诉你答案!

    看到这,你也许有疑问:C语言功能强大,运行这么简单的一个程序就算入门了,没这么简单吧?

    猫咪爱分享
  • 从业必看!2017年Python这些重要的事件

    2017年仿佛整个程序员圈都在焦虑学习python,为了帮助马哥小伙伴发现2018年Python的趋势,汤哥在马哥Python的万人学习社群做了个调研,盘点了一...

    小小科
  • 从业必看!2017年Python这些重要的事件

    2017年仿佛整个程序员圈都在焦虑学习python,为了帮助马哥小伙伴发现2018年Python的趋势,汤哥在马哥Python的万人学习社群做了个调研,盘点...

    小莹莹
  • C语言知识汇总,史上最全面总结,没有之一

    C语言中文社区

作者介绍

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券