Contest 5
符号函数
Description
本题要求实现符号函数sign(x)。
函数接口定义:
int sign( int x );
其中x是用户传入的整型参数。符号函数的定义为:若x大于0,sign(x) = 1;若x等于0,sign(x) = 0;否则,sign(x)=−1。
Input
一个整数x。
Output
sign(x)的值
Sample Input 1
10
Sample Output 1
1
#include <stdio.h>
int sign(int x);
int main()
{
int x;
scanf("%d",&x);
printf ("%d",sign(x));
return 0;
}
int sign(int x)
{
/*这儿不能再写int x,因为已在上一行写过,不能重复声明*/
if (x>0)
{
printf("1\n");
}
else if (x==0)/*注意两个==号*/
{
printf("0\n");
}
else
{
printf("-1");
}
return x;
}
使用函数求奇数和
Description
本题要求实现一个函数,计算N个整数中所有奇数的和,同时实现一个判断奇偶性的函数。
函数接口定义:
int even( int n );
int OddSum( int List[], int N );
其中函数even将根据用户传入的参数n的奇偶性返回相应值:当n为偶数时返回1,否则返回0。函数OddSum负责计算并返回传入的N个整数List[]中所有奇数的和。
Input
第一行一个整数n。
接下来一行是n个整数的序列。
Output
一个整数,表示奇数和。
Sample Input 1
6
2 -3 7 88 0 15
Sample Output 1
19
#include <stdio.h>
int a[666],n;
int even(int n){
if(n<=0)n=~n+1;
return n%2==1 ? 0:1;
}
int OddSum(int List[],int N){
int ans=0;
for(int i=0;i<N;i++){
if(!even(List[i])){
ans+=List[i];
}
}
return ans;
}
int main(void) {
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
printf("%d",OddSum(a,n));
return 0;
}
使用函数计算两点间的距离
Description
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。
函数接口定义:
double dist( double x1, double y1, double x2, double y2);
其中用户传入的参数为平面上两个点的坐标(x1, y1)和(x2, y2),函数dist应返回两点间的距离。
Input
一行四个浮点数。
Output
一个浮点数,保留两位小数。
Sample Input 1
10 10 200 100
Sample Output 1
210.24
#include <stdio.h>
#include <math.h>
double x1,y11,x2,y2;
double dist(double,double,double,double);
int main(void) {
scanf("%lf%lf%lf%lf",&x1,&y11,&x2,&y2);
printf("%.2lf",dist(x1,y11,x2,y2));
return 0;
}
double dist(double x1,double y11,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y11-y2)*(y11-y2));
}
使用函数求素数和
Description
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。
素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
函数接口定义:
int prime( int p );
int PrimeSum( int m, int n );
其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[m,n]内所有素数的和。题目保证用户传入的参数m≤n。
Input
两个整数m和n。(m <= n)
Output
一个整数表示答案。
Sample Input 1
-1 10
Sample Output 1
17
#include <stdio.h>
int a[666666];
void getprime(int n){
a[1]=1;
for(int i=2;i<=n;i++){
if(a[i])continue;
for(int j=2;i*j<=n;j++)a[i*j]=1;
}
}
int PrimeSum(int m,int n){
int ans=0;
if(m<=0)m=1;
for(int i=m;i<=n;i++){
if(!a[i])ans+=i;
}
return ans;
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
getprime(n);
printf("%d",PrimeSum(m,n));
return 0;
}
使用函数统计指定数字的个数
Description
本题要求实现一个统计整数中指定数字的个数的简单函数。
函数接口定义:
int CountDigit( int number, int digit );
其中number是不超过长整型的整数,digit为[0, 9]区间内的整数。函数CountDigit应返回number中digit出现的次数。
Input
一行两个整数number和digit。
Output
一行一个整数表示答案。
Sample Input 1
-21252 2
Sample Output 1
3
#include <stdio.h>
int CountDigit( int number, int digit ){
if(number<=0)number=~number+1;
int tmp,ans=0;
while(number>0){
tmp=number%10;
if(tmp==digit)ans++;
number/=10;
}
return ans;
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
printf("%d",CountDigit(m,n));
return 0;
}
使用函数输出水仙花数
Description
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1^3+5^3+3^3。 本题要求编写两个函数,
一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。
函数PrintN则打印闭区间[m, n]内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。
Input
一行两个整数m,n。
Output
从小到大输出若干行,每行一个水仙花数。
Sample Input 1
153 400
Sample Output 1
153
370
371
#include<stdio.h>
int m,n;
int narcissistic( int number );
void PrintN( int m, int n );
int main(){
scanf("%d%d",&m,&n);
PrintN(m,n);
return 0;
}
void PrintN( int m, int n ){
int t,digit;
for (int i = m; i < n; i++){
int sum = 0,num=i,numm=i,lenn=0;
while(numm>0){
lenn++;
numm/=10;
}
while(num > 0){
t = 1;
digit = num%10;
for (int j = 0; j < lenn; j++)
{
t *= digit;
}
sum += t;
num = num/10;
}
if (sum == i)printf("%d\n",i);
}
}
使用函数求余弦函数的近似值
Description
本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x^0/0!−x^2/2!+x^4/4!−x^6/6!+⋯
函数接口定义:
double funcos( double e, double x );
其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。
Input
两个浮点数e和x。
Output
一个浮点数表示答案,保留6位小数。
Sample Input 1
0.01 -3.14
Sample Output 1
-0.999899
#include <stdio.h>
#include <math.h>
double funcos(double e,double x){
double ans=0.0f;
double xx=1.0f,tmp=x*x,yy=1.0f;
int i;
for(i=0;;i+=2){
double tmp1=xx/yy;
if((i/2)%2==0)ans+=tmp1;
else ans-=tmp1;
if(tmp1<e)break;
xx*=tmp;
yy*=((i+1)*(i+2));
}
return ans;
}
int main(){
double e,x;
scanf("%lf%lf",&e,&x);
printf("%.6lf",funcos(e,x));
return 0;
}