一、求指定区间的[a,b]内的勾股数组
勾股数指:能够成直角三角形三条边的三个正整数。如(3,4,5)和(5,12,13)是最小的两组勾股数。
用数学公式描述为 :满足的正整数组(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,有数学公式(海伦-秦九韶)
其中p=1/2(a+b+c)
三角形外接圆半径公式,
三角形内切圆半径公式,
程序开头要检查输入的三角形三边长度是否可以构成三角形,即三角形任意两边之和大于第三边,若不能构成,则退出。
如果输入的三角形三边的长度能构成三角形,还要判断构成什么三角形,直角三角形,等腰三角形,等边三角形。提示是什么三角形后再计算的面积,外接圆半径,内切圆半径,并输出这些值
#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'才停止循环。