第十三周编程总结
6-1 使用函数计算两点间的距离 (10 分)
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。
函数接口定义:
double dist( double x1, double y1, double x2, double y2 );
其中用户传入的参数为平面上两个点的坐标(x1
, y1
)和(x2
, y2
),函数dist
应返回两点间的距离。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
double dist( double x1, double y1, double x2, double y2 );
int main()
{
double x1, y1, x2, y2;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
printf("dist = %.2f\n", dist(x1, y1, x2, y2));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10 10 200 100
输出样例:
dist = 210.24
1)实验代码
return sqrt(pow(x2-x1,2)+pow(y2-y1,2));
}
6-2 符号函数 (10 分)
本题要求实现符号函数sign(x)。
函数接口定义:
int sign( int x );
其中x
是用户传入的整型参数。符号函数的定义为:若x
大于0,sign(x)
= 1;若x
等于0,sign(x)
= 0;否则,sign(x)
= −1。
裁判测试程序样例:
#include <stdio.h>
int sign( int x );
int main()
{
int x;
scanf("%d", &x);
printf("sign(%d) = %d\n", x, sign(x));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10
输出样例:
sign(10) = 1
{
if(x>0)
x=1;
else if(x==0)
x=0;
else
x=-1;
return x;
}
6-7 使用函数计算两个复数之积 (10 分)
若两个复数分别为:c1=x1+y1ic_1=x_1 + y_1 ic1=x1+y1i和c2=x2+y2ic_2=x_2 + y_2 ic2=x2+y2i,则它们的乘积为 c1×c2=(x1x2−y1y2)+(x1y2+x2y1)ic_1 \times c_2 = (x_1 x_2 - y_1 y_2) + (x_1 y_2 + x_2 y_1)ic1×c2=(x1x2−y1y2)+(x1y2+x2y1)i。
本题要求实现一个函数计算两个复数之积。
函数接口定义:
double result_real, result_imag;
void complex_prod( double x1, double y1, double x2, double y2 );
其中用户传入的参数为两个复数x1
+y1
iii和x2
+y2
iii;函数complex_prod
应将计算结果的实部存放在全局变量result_real
中、虚部存放在全局变量result_imag
中。
裁判测试程序样例:
#include<stdio.h>
double result_real, result_imag;
void complex_prod( double x1, double y1, double x2, double y2 );
int main(void)
{
double imag1, imag2, real1, real2;
scanf("%lf %lf", &real1, &imag1);
scanf("%lf %lf", &real2, &imag2);
complex_prod(real1, imag1, real2, imag2);
printf("product of complex is (%f)+(%f)i\n", result_real, result_imag);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 2
-2 -3
输出样例:
product of complex is (4.000000)+(-7.000000)i
{
result_real=x1*x2-y1*y2; //c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i
result_imag=x1*y2+x2*y1;
}
本题要求实现一个计算两个数的最大公约数的简单函数。
函数接口定义:
int gcd( int x, int y );
其中x
和y
是两个正整数,函数gcd
应返回这两个数的最大公约数。
裁判测试程序样例:
#include <stdio.h>
int gcd( int x, int y );
int main()
{
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", gcd(x, y));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
32 72
输出样例:
8
{
int i;
for(i=x;i>=1;i--)
{
if(x%i==0&&y%i==0)
break;
}
return i;
}
6-11 使用函数输出水仙花数 (20 分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic
判断number
是否为水仙花数,是则返回1,否则返回0。
函数PrintN
则打印开区间(m
, n
)内所有的水仙花数,每个数字占一行。题目保证100≤m
≤n
≤10000。
裁判测试程序样例:
#include <stdio.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
153 400
输出样例:
153 is a narcissistic number
370
371
{
int x,count=0,i,sum=1,a,b=0;
x=number;
while(x!=0)
{
x=x/10;
count++; //这里求n的位数
}
x=number; //初始化x的值 进过while函数后x变化
while(x!=0)
{
a=x%10; //求余
for(i=1;i<=count;i++)
{
sum=sum*a; //余数累乘
}
b=sum+b; //累加
x=x/10; //位数减1
sum=1; //初始化i sum 的值,发现循环里面套循环 end的值会变的很大 sum也是
}
if(b==number)
{
return 1;
}else
{
return 0;
}
}
{
int i; //从m+1位开始
for(i=m+1;i<n;i++) //同一个代码 新建一个源文件以后就可以了
{ //前面之所以使用x=number 是因为后面需要重置number的值;这里不需要重置 不用int M N
if(narcissistic( i )==1) //满足条件为真
printf("%d\n",i);
}
}