C语言 谭浩强 题目 -第五章
作者:互联网
文章目录
第五章
EG 4
在全系1000个学生中,征集慈善捐款,当总数达到10万元时就结束,统计此时的捐款人数,以及平均每人捐款的数目。
解题思路:显然应该用循环来处理。实际实际循环的次数事先不能确定,可以设置为最大值(1000)在循环体中累计捐款总数,并用if语句检查是否达到10万元,如果达到就不再继续执行循环,终止累加,并计算人均捐款数。
#include<stdio.h>
# define SUM 100000
void main()
{
double num,total=0.0;
int i=1;
while(i)
{
printf("请输入数目:\n");
scanf("%lf",&num);
total+=num;
i++;
if(total>=SUM)
{
printf("捐款人数=%d,平均捐款数目=%lf",i,total/i);
break;
}
else continue;
}
}
EG 5
100-200不能被3整除的数字
EG 7
求pai
#include <stdio.h>
#include <math.h>
int main(){
double num=1,pi,tmp=1.0;
int sign=1;
while(fabs(num)>=1e-6){
pi+=num;
tmp+=2;
sign=-sign;
num=sign/tmp;
}
pi=4*pi;
printf("pi的值为:%.6f\n",pi);
}
EG 8
求斐波那契数列前40个数
#include <stdio.h>
int main()
{
int f1=1,f2=1,i=1;
for(;i<=20;i++)
{
printf("%10d\t%10d\t",f1,f2);
f1=f1+f2;
f2=f1+f2;
if(i%2==0)
{
printf("\n");
}
}
return 0;
}
EG 9
输入一个数 , 判断是不是素数
#include <stdio.h>
void sushu(int n);
int main()
{
int n;
printf("请输入n:\n");
scanf("%d",&n);
sushu(n);
// main();
return 0;
}
void sushu(int n)
{
int count = 0,i;
int k;
k=(int)sqrt(n);
for(i=2;i<=k;i++)
{
if(n%i==0)
{
printf("%d 不是素数",n);
count = 1;
break;
}
}
if(count==0)
{
printf("%d 是素数",n);
}
}
EG 10
求100–200之间的素数
- 偶数不是素数,从101开始,每次加2
#include <stdio.h>
#include <math.h>
void main()
{
int i,j;
int k; //定义循环变量
for(i=101;i<=200;i+=2) //定义从100-200之间的循环数字
{
k = (int)sqrt(i);
for(j=2;j<=k;j++) //判定条件从(2)---(k)之间能否被i整除
{
if(i%j==0) break; //如果可以则跳出循环,不是素数
}
if(j>=k) //如果j>=k则为素数,并输出
printf("i =%d ,j = %d,k=%d\n",i,j,k); //用表格的形式输出结果
}
}
结果:
EG 11
要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.
例如,字母"A"后面第4个字母是"E".“E"代替"A”。因此,“China"应译为"Glmre”。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。
输入
China!
输出
加密后的China!
样例输入
China!
样例输出
Glmre!
#include <stdio.h>
int main()
{
char c;
while((c=getchar())!='\n')
{
if((c>='A'&&c<='Z')||c>='a'&&c<='z')
{
c+=4; //不管三七二十一 ,先全部转换;
// 如果是 后4位字母
// 注意大小写的区别!!
if((c>='Z'&&c<='Z'+4)||c>='z')
{
c=c-26;
}
}
printf("%c",c);
}
printf("\n");
}
习题 3
求最大公约数,最小公倍数
#include <stdio.h>
void main()
{
printf("请输入两个数:");
int n,m;
scanf("%d,%d",&n,&m);
int n1=n,m1=m;
if(m>n)
{
int tmp;
tmp = m;
m = n;
n = tmp;
}
while(m!=0)
{
int tmp;
tmp = n%m;
n = m;
m = tmp;
}
printf(" min = %d",n);
int max = n1*m1/n;
printf(" max = %d",max);
}
习题 4
统计输入的字符各类的个数
#include <stdio.h>
void main()
{
char c;
int word=0,num=0,empty = 0,other=0;
while((c=getchar())!='\n')
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) word++;
else if((c>='0'&&c<='9'))
{
num++;
}
else if ((c==' '))
{
empty++;
}
else other++;
}
printf("字母个数:%d\n",word);
printf("数字个数:%d\n",num);
printf("空格个数:%d\n",empty);
printf("其他个数:%d\n",other);
}
习题 5
#include <stdio.h>
#include <math.h>
int main()
{
int n,a,i; //n为a的个数
int sum = 0, num = 0;
printf("请输入 n,a: ");
scanf("%d,%d", &n ,&a);
num=a;
sum=a;
printf("sum = %d",sum);
for (i = 1; i<n; i++)
{
num = num*10 +a;
sum += num;
printf(" +%d",num);
}
printf("\nsum = %d\n", sum);
// main();
return 0;
}
另解
#include <stdio.h>
#include <math.h>
int main()
{
//n为a的个数
int n;
double a, prev_sum = 0.0, total_sum = 0.0;
printf("请输入a的值以及n的值: ");
scanf("%lf %d", &a, &n);
//循环n次求总和
for (int i = 0; i < n; i++)
{
prev_sum += a * pow(10, i);
total_sum += prev_sum;
}
printf("总和为:%lf\n", total_sum);
return 0;
}
请输入 n,a: 4,6
sum = 6 +66 +666 +6666
sum = 7404
习题 6
对于20的阶乘已经超出了int类型能过表示的数字范围,所以在代码当中使用double类型
#include<stdio.h>
void main()
{
int i;
double sum = 0.0,num = 1.0;
for(i=1;i<=20;i++)
{
num*=i;
sum+=num;
}
printf("1~20每个数字阶乘总和为:%lf\n",sum);
}
1~20每个数字阶乘总和为:2561327494111820300.000000
习题 7
#include<stdio.h>
void main()
{
int i=1;
double sum,sum1,sum2,sum3;
for(;i<=100;i++)
{
sum1+=i;
if(i<=50) sum2+=(i*i);
// 实型的除法!!!
if(i<=10) sum3+=(1.0/i);
}
sum = sum1+sum2+sum3;
printf("sum = %lf",sum);
}
sum = 47977.928968
习题 8
求水仙花数
#include<stdio.h>
#include<math.h>
void main()
{
int a,b,c,n=100;
for(;n<1000;n++)
{
a = n / 100;
b = (n / 10) % 10;
c = n % 10;
if(pow(a,3)+pow(b,3)+pow(c,3) == n) printf("%d\n",n);
}
}
习题 9
求完数
#include <stdio.h>
void wanshu(int n);
void main()
{
int n;
printf("输入数字");
scanf("%d",&n);
wanshu(n);
}
void wanshu(int n)
{
int i;
int sum=0;
int k=0,j;
int a[100];
for(i=1;i<=n/2;i++)
{
if(n%i==0)
{
sum +=i;
a[k]=i;
k++;
}
if(sum==n)
{
j=k;
printf("%d its fators are ",n);
for(k=0;k<j;k++)
{
printf("%d,",a[k]);
}
}
}
}
拓展
输出1000之内的所有完数,并输出其因子。
习题 10
#include<stdio.h>
void main()
{
double sum, i=1.0,j=2.0;
int k = 20;
while(k)
{
int tmp;
sum+=(j/i);
tmp = j;
j+=i;
i=tmp;
k--;
}
printf("sum = %lf",sum);
}
习题 11
一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
该题目需要循环10次,在每一循环的时候,需要将下落的高度和回弹的高度加起来。需要注意的点,第10次下落不需要在计算回弹的距离了,所以需要特殊处理下。在计算每次高度的时候,会有小数存在,所以需要选用浮点数
#include<stdio.h>
void main()
{
double sum1=100,sum2=50; //已经落地第一次,开始反弹
int k = 9; //还需要9次落地
while(k)
{
sum1+=sum2*2; //先计算 反弹 下降 的路程
sum2/=2; //落地 ,准备反弹的高度
k--;
}
sum2/2; //第十次落地,反弹的高度
printf("sum1 = %lf, sum2 = %lf",sum1,sum2);
}
sum1 = 299.609375, sum2 = 0.097656
习题 12
猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃一个,以后每天早上都吃了前一天剩下的一半零一个,到第10天早上想再吃时,见只剩下一个桃子,求第一天共有多少桃子
- 逆向思维
#include<stdio.h>
#include <stdlib.h>
int main(){
int n; //天数
int i; //桃子数
int a = 1;
scanf("%d",&n);
for (i=1;i<=n;i++){
a++;
a*=2;
}
printf("%d",a);
return 0;
}
- 函数递归
#include <stdio.h>
int fun(int n, int k)
{ //参数n表示第n天剩余的桃子树 参数k表示第k天剩余的桃子数为1
int sum;//定义一个整型变量sum
if (n == k)
{
sum = 1;
}
else
sum = 2 * (fun(n + 1, k) + 1); //调用递归函数 函数里面再调用函数
return sum;//返回 sum
}
void main()
{
int k = 10, sum = 0;
printf("请输入猴子吃桃子的天数\n请输入k=");
scanf_s("%d", &k);
sum = fun(1, k);//
printf("猴子第一天摘桃子为=%d",sum);
}
习题 13
一、求一个数a的平方根,可以用迭代法无限逼近。
迭代法公式如下
X2 = (x1+a/x1)/2
1,要先预估一个值x1,通常取x1=a/2;
2,带入迭代公式,得到x2;
3,计算x1 和 x2 的差的绝对值是否符合精确度;若符合则x2便是结果,若不符合进入S4;
4,x1 = x2,然后重复S2、S3,直到符合精确度。
#include <stdio.h>
#include <math.h>
int main()
{
double a;
double x1, x2;
printf("请输入待求平方根的数:");
scanf("%lf",&a);
x1 = a/2;
x2 = (x1+a/x1)/2;
while(fabs(x1-x2)>=1e-8)
{
x1 = x2;
x2 = (x1+a/x1)/2;
}
printf("%f",x2);
}
请输入待求平方根的数:99
9.949875
习题 14
用牛顿迭代法求下列方程在值等于2.0附近的根:2x3-4x2+3x-6=0。
迭代公式
x2 = x1 - f(x1)/df(x1);
#include <stdio.h>
#include <math.h>
double funY1(double x);
double funY2(double x);
int main() {
double x1, x2;
x1 = 1.5; //求1.5附近的根
x2 = x1 - funY1(x1) / funY2(x1);
while (fabs(x2 - x1) >= 1e-5) {
x1 = x2;
x2 = x1 - funY1(x1) / funY2(x1);
}
printf("%lf",x2);
}
// y 函数
double funY1(double x) {
double y1;
y1 = 2*pow(x,3) - 4*pow(x,2) + 3*x - 6;
return y1;
}
//y的一阶导数
double funY2(double x) {
double y2;
y2 = 6*pow(x,2) - 8*x + 3;
return y2;
}
习题 15
用二分法求方程2x ^ 3 -4x^2+3x-6=0在(-10,10)之间的根
#include <stdio.h>
#include <math.h>
//函数声明
double fun(double x);
int main() {
double x1=-10.0, x2=10.0,x0;
double y1,y2,y0;
y1 = fun(x1);
y2 = fun(x2);
do
{
x0=(x1+x2)/2;
y0 = fun(x0);
if ((y0*y1)<0) //表示根在该区间
{
x2=x0; //调制端点
y2=y0;
}
else
{
x1=x0;
y1=y0;
}
} while(abs(y0)>1e-10);
printf("方程的根为%f",x0);
}
// 函数定义
double fun(double x)
{
double y1;
y1 = 2*pow(x,3) - 4*pow(x,2) + 3*x - 6;
return y1;
}
习题 16
输入一下图形:
*
***
*****
*******
*****
***
*
#include <stdio.h>
void main() {
int i,j,k;
for(i=1;i<=4;i++)
{
for(j=4-i;j>0;j--)
{
printf(" ");
}
for(k=1;k<=(2*i)-1;k++)
{
printf("*");
}
printf("\n");
}
for(i=3;i>=1;i--)
{
for(j=4-i;j>0;j--)
{
printf(" ");
}
for(k=1;k<=(2*i)-1;k++)
{
printf("*");
}
printf("\n");
}
}
习题 17
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比, c说他不和x,z比,请编程序找出三队赛手的名单。
#include <stdio.h>
void main() {
char a,b,c;
for(c='x';c<='z';c++) //从C开始判断
{
if((c!='x')&&(c!='z')) // C不跟 X,Z打
{
for(a='x';a<='z';a++) //判断a
{
if(a!=c&&a!='x') // ac 对手不相同,a不跟x打
{
for(b='x';b<='z';b++) //就剩下b
{
if(b!=a&&b!=c) // b 与a,c的对手都不一样
printf("a=%c,b=%c,c=%c",a,b,c);
}
}
}
}
}
}
标签:x1,int,sum,C语言,谭浩强,第五章,printf,习题,include 来源: https://blog.csdn.net/weixin_51552144/article/details/121427393