ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言 谭浩强 题目 -第五章

2021-11-20 15:04:05  阅读:165  来源: 互联网

标签:x1 int sum C语言 谭浩强 第五章 printf 习题 include


文章目录

第五章

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有