引言
临近期末考试,计算机专业的大一学生将面临对自己所学知识的一次检测,本文主要提供了关于C语言程序设计(第四版)第3章课后程序设计题的个人所做,供各位借鉴与复习,不学习本册书的同学也可以把下题当作复习参考题略过一遍,增加考试底气。
本节为第3章,所以所用知识点均来自第3章。
由于本人是大一学生第一次写博客,如所做答案存在谬误,请见谅与指正,谢谢。
希望每个人都能安稳考过期末考试,并且取得好成绩。
题1.输入10个整数,统计并输出正数、负数和零的个数
#include<stdio.h>
int main()
{
int n = 0, pn = 0, zero = 0,input;
for (int i = 0; i < 10; i++)
{
scanf_s("%d", &input);//在Visual Studio中使用代替scanf,其他编译器用scanf即可
if (input < 0)
pn++;
else if (input > 0)
n++;
else
zero++;
//或者
//if (input == 0)
// zero++;
//else input > 0 ? n++ : pn++;
}
printf("正数个数为%d,负数个数为%d,0的个数为%d", n, pn, zero);
return 0;
}
题2.求100以内的自然数中能被32整除的最大数
#include<stdio.h>
int main()
{
int n=32;
while (1)
{
if (n + 32 > 100)
break;
n += 32;
}
printf("%d", n);
return 0;
}
题3.计算100~999个位数为3的自然数的个数
#include<stdio.h>
int main()
{
int count=0;
for (int i = 100; i < 1000; i++)
if (i % 10 == 3)
count++;
printf("%d", count);
return 0;
}
题4.输入两个正整数,输出他们的最大公约数和最小公倍数
#include<stdio.h>
int main()
{
unsigned a, b;
scanf_s("%d %d", &a, &b);
//最大公约数
int max, min;
for (int i = a < b ? a : b; i >= 1; i--)//寻找较小值
{
if(a % i == 0 && b % i == 0)//&&表示与,||表示或
{
max = i;
break;
}
}
printf("最大公约数为:%d", max);
//或者求最大公约数用欧几里得算法—时间复杂度低
//即连续计算余数直到余数为0为止,最后的非零余数就是最大公约数
//代码如下
//while (b > 0)//可以自己找两个随便的数试一试
//{
// max = a % b;
// a = b;
// b = max;
//}
//max = a;//此时最大公约数即为a
//最小公倍数
int c = a > b ? a : b;//a,b中较大的值
for (int i = c; i <= a * b; i += c)
{
if (i % a == 0 && i % b == 0)
{
min = i;
break;
}
}
printf("最小公倍数为:%d", min);
return 0;
}
题5.用if~else结构编写程序,求一元二次方程
的根
#include<stdio.h>
#include<math.h>//sqrt求平方根
int main()
{
float a, b, c;
scanf_s("%f %f %f", &a, &b, &c);//依次输入abc
float first, second;//两根
float dt= b * b - 4 * a * c;
if (dt < 0)
printf("此方程无根");
else if (dt == 0)
{
first = second = -b / (2 * a);
printf("该方程仅有唯一根即%.2f",first);
}
else
{
first = (-b + sqrt(dt))/(2*a);
second = (-b - sqrt(dt)) / (2 * a);
printf("该方程两根为:%.2f %.2f", first, second);
}
return 0;
}
题6.用switch~case结构编写程序,输入月份1~12后,输出该月份的英文名称
#include<stdio.h>
int main()
{
int a;
scanf_s("%d", &a);
switch (a)
{
case 1:
printf("January");
break;
case 2:
printf("February");
break;
case 3:
printf("March");
break;
case 4:
printf("April");
break;
case 5:
printf("May");
break;
case 6:
printf("June");
break;
case 7:
printf("July");
break;
case 8:
printf("August");
break;
case 9:
printf("September");
break;
case 10:
printf("October");
break;
case 11:
printf("November");
break;
case 12:
printf("December");
break;
}
return 0;
}
题7.求Sn=a+aa+aaa+...+aa...a(最后一项为n个a)的值,其中a是一个数字。如2+22+222+2222+22222(此时n=5),n和a的值从键盘上键入。
#include<stdio.h>
int main()
{
int a,n,sum=0,sum1=0;
scanf_s("%d %d", &a,&n);
for (int i = 1; i <= n; i++)
{
int q = a;
sum1 = 0;
for (int j = 1; j <= i; j++)
{
if (j >= 2)
q = q * 10;
sum1 += q;//表示222之类
}
sum += sum1 ;
}
printf("%d", sum);
return 0;
}
题8.打印所有水仙花数。水仙花数是指一个3位数,其各位数的立方和等于该数本身。如
,153是一个水仙花数
#include<stdio.h>
int main()
{
for (int i = 100; i < 1000; i++)
{
int a1 = i % 10,a10=(i%100)/10,a100=i/100;
if (a1 * a1 * a1 + a10 * a10 * a10 + a100 * a100 * a100 == i)
printf("%d ", i);
}
return 0;
}
题9.计算下式
#include<stdio.h>
int main()
{
float sum=0;
for (float i = 1; i <= 100; i++)
sum += 1 / i;
for (float i = 1; i <= 50; i++)
sum += 1 / (i * i);
printf("%f", sum);
return 0;
}
题10.编写程序,按下列公式计算e的近似值
(精度要求为
<10)
#include<stdio.h>
int main()
{
float e=2,n=2;//省略1+1/1!
while (1)
{
float sum=n;
for (float i = n-1; i >= 1; i--)
sum *= i;
if (1 / sum <= 1e-6)
break; //终止条件
e += 1/sum;
n++;
}
printf("%f", e);
return 0;
}
题11.编写程序,按下列公式计算y的值
(精度要求为
)
#include<stdio.h>
int main()
{
float y=0;
for (float r = 1; r <= 1000; r++)//有精度要求,所以n就随便写一个1000
{
if (1 / (r * r + 1) < 1.0e-6)
break;
y += 1 / (r * r + 1);
}
printf("%f", y);
return 0;
}
题12.有一框苹果,两个一取余一,三个一取余二,四个一取余三,五个一取刚好不剩,问框中至少有多少个苹果
#include<stdio.h>
int main()
{
for (int i = 5;; i += 5)
if (i % 2 == 1 && i % 3 == 2 && i % 4 == 3)
{
printf("框中至少有%d个苹果", i);
break;
}
return 0;
}