每日练习(4-6)

一、求指定区间的[a,b]内的勾股数组

       勾股数指:能够成直角三角形三条边的三个正整数。如(3,4,5)和(5,12,13)是最小的两组勾股数。

用数学公式描述为 :满足x^{2}+y^{2}=z^{2}的正整数组(x,y,z)就是一组勾股数。

勾股数由无限多个,但具体某个区间内是有限的。

        程序设计要点:指定区间[a,b]内,设置二重循环在指定区间穷举x、y(x<y),应用定义式计算z=sqrt(x*x+y*y)。

若z>b或z不为整数,返回;否则,输出勾股数x,y,z。

#include<stdio.h>
#include<math.h>
void main(){
	int a,b,n;
	long x,y,z,d;
	printf("  求指定区间 [a,b]内的勾股数组。");
	printf("\n  请输入区间[a,b]的上下限");
	scanf("%d,%d",&a,&b);
	printf("\n区间[%d,%d]内的勾股数组有:\n",a,b);
	//最小的勾股数组为,3,4,5
	//所以最小在 [x,5]中出现一组勾股数
	//b最小为5
	if(b<5) 
	printf("  输入左端点过小,应当大于5\n");
	if(a==0) a=2;
	n=0;

	/*上面这个代码,若a==0因为最小的勾股数从3
	开始所以,将a的值赋为2,减少遍历区间。*/ 
	for(x=a;x<=b-2;x++)
	//此处为左端点遍历 ,因为x,y必为不同的整数,所以x<=b-2*/
	/* 比如[2,6],在[4,6]必不存在勾股数*/
	for(y=x+1;y<=b-1;y++)//此处为右端点遍历 ,且右端点必须大于左端点 
	{
		//由公式z=sqrt(x*x+y*y) 
		d=x*x+y*y;
		z=sqrt(d);
		if(z>b) break;
		if(z*z==d)
		{
			n++;
			printf(" %ld^2+%ld^2=%ld^2\n",x,y,z);
		}
	 } 
		printf("共%d组勾股数组。\n",n);	
	
}

输入时,注意用逗号隔开

二、百鸡问题

中国古代算书《 张丘建算经》中有一道著名的百鸡问题:公鸡每只值5 文钱,母鸡每只值3 文钱,而3 只小鸡值1 文钱。用100 文钱买100 只鸡,问:这100 只鸡中,公鸡、母鸡和小鸡各有多少只?

这个问题流传很广,解法很多,但从现代数学观点来看,实际上是一个求 不定方程整数解的问题。解法如下:

设公鸡、母鸡、小鸡分别为x、y、z 只,由 题意得:

①x+y+z =100

②5x+3y+(1/3)z =100

有两个方程,三个未知量,称为不定方程组,有多种解。

             程序要点:穷举求解时,判断是否满足条件x+y=100&&5x+3y+(1/3)z =100,满条件的解打印输出

#include<stdio.h>
void main(){
	int x,y,z,n;
	n=0;
	for(x=1;x<=100/5;x++)
		for(y=1;y<=100/3;y++)
			for(z=3;z<=99;z=z+3)
			if(x+y+z==100&&5*x+3*y+z/3==100) 
			{
				n=n+1;
				printf(" %d: x=%d,y=%d,z=%d\n",n,x,y,z);
				break;
			} 
} 

三、输入三角形三边求此三角形面积、外接圆半径和内切圆半径

已知三角形三边长度a,b,c,有数学公式(海伦-秦九韶)S=\sqrt{p(p-a)(p-b)(p-c)}

其中p=1/2(a+b+c)

三角形外接圆半径公式,R=\frac{abc}{4S}

三角形内切圆半径公式,r=\frac{S}{p}

程序开头要检查输入的三角形三边长度是否可以构成三角形,即三角形任意两边之和大于第三边,若不能构成,则退出。

如果输入的三角形三边的长度能构成三角形,还要判断构成什么三角形,直角三角形,等腰三角形,等边三角形。提示是什么三角形后再计算的面积,外接圆半径,内切圆半径,并输出这些值

#include<stdio.h>
#include<math.h>
void main(){
	float a,b,c,s,s1,r,r1;
//a,b,c为三条边长;s1为面积公式中的p;r为外接圆半径;r1为内接圆半径
	printf("请输入所求三角形的三条边的长度 a,b,c: ");
	scanf("%f,%f,%f",&a,&b,&c);
	if((a==0)|(b==0)|(c==0)) 
	{
		printf("这三边无法构成三角形。\n");
		return; 
	} 
	if((a+b<=c)|(a+c<=b)|(b+c<=a))
	{
		printf("这三边无法构成三角形。\n");
		return; 		
	}
	if((a==b)&&(b==c))
	{
		printf("这是一个等边三角形。\n");
		goto q1; 
	}
	if((a==b)|(b==c)|(a==c))
	{
		printf("这是一个等腰三角形。\n");
		goto q1; 
	}	
	if(a*a+b*b==c*c)
	{
		printf("这是一个直角三角形。\n");
	}
	q1:s1=(a+b+c)/2.0;
	s=sqrt(s1*(s1-a)*(s1-b)*(s1-c)); 
	r=a*b*c/(4.0*s);
	r1=s/s1;
	printf("这个三角形的面积s=%6.2f\n",s);
	printf("这个三角形的外接圆半径r=%6.2f\n",r);
	printf("这个三角形的内接圆半径r1=%6.2f\n",r1);
} 

顺便再复习下goto语句

无条件转移语句,其一般格式为:goto 语句标号;其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。

语句标号起标识语句的作用,与goto语句配合使用。如: label: i++;loop: while(x<7);

统计从键盘输入一行字符的个数。

#include"stdio.h"

int main(void)

{

int n=0;

printf("input a string :\n");

loop: if(getchar()!='\n')

{

n++;

goto loop;

}

printf("%d",n);

}

例如输入:ahifhoaishfoasdfkasg

然后回车Enter

输出:20

本例用if语句和goto语句构成循环结构。当输入字符不为'\n'时即执行n++进行计数,然后转移至if语句循环执行。直至输入字符为'\n'才停止循环。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值