其他分享
首页 > 其他分享> > C语言 谭浩强 题目 -第五章

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之间的素数

#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