本人能力有限,发出只为帮助有需要的人。
建议同学们自己写完后再进行讨论。
1. (单选题)有函数定义:int f(int x,int y);则下列函数调用正确的为( )
- A.int n; n=f();
- B. int n,a=0,b=1;n=int f(x,y);
- C. int n,a=0,b=1;n=f(a,b);
- D.int n,a=0,b=1; n=f(int a,int b);
答案选C
二. 程序题(共5题,83.4分)
2. (程序题)
题目编号:Exp03-Basic01,GJBook3-05-02
题目名称:组合问题
题目描述:编写程序,输入m,n的值,计算并输出函数f的值。
输入:一个整数m和一个整数n(m,n≤20)。
输出:函数f的值。
样例1:
输入:-1 2
输出:-1
样例2:
输入:2 2
输出:1
#include<stdio.h>
long long fac(long long x);
int main(void)
{
int m,n,a;
scanf("%d %d",&m,&n);
if(m<n&&m>0&&n>0)
printf("0");
else if(m==n&&m>0&&n>0)
printf("1");
else if(m>n&&m>0&&n>0)//运用阶乘的函数
{
a=fac(m)/(fac(m-n)*fac(n));
printf("%d",a);
}
else
printf("-1");
return 0;
}
long long fac(long long x)//fac函数为阶乘函数
//n,m小于20需要用longlong类型
{
int k;
for(k=(x-1);k>0;k--)
{
x*=k;
}
return x;
}
3. (程序题)
题目编号:Exp03-Basic02,GJBook3-05-06
题目名称:逆序数
题目描述:编写函数,求任意位自然数的逆序数,例如5432就是2345的逆序数。
输入:任意一个整数(<10^18) 。
输出:如果输入的不是自然数,则输出NULL;否则输出对应的逆序数。
样例1:
输入:120
输出:21
样例2:
输入:999999999999999999
输出:999999999999999999
样例3:
输入:-1357
输出:NULL
#include<stdio.h>
int LastNumber(long long x);
int main()
{
long long a;
scanf("%lld",&a);
if(a<0)
printf("NULL");
else
LastNumber(a);
}
int LastNumber(long long x)//取最后一个字母
{
long long n;
int k=0,m;
while(x>0)
{
n=x/10;
m=x-n*10;
x=(x-m)/10;
k++;//事实上这段代码还是有bug的
//此代码无法判断多个尾数为0
//1200逆序应为21,此代码跑出的是021
if(m!=0||k!=1)
printf("%d",m);
}
return 0;
}
4. (程序题)
题目编号 :Exp03-Basic03
题目名称:多边形周长
题目描述:编写程序,求由键盘按顺时针方向输入n(0<n<=10)个顶点坐标的多边形周长(测试数据已保证当n>2时,各点按输入方向依次连接可构成封闭的n边形)。
输入:第一行输入一个整数,作为n值;以后每行两个浮点数(double),为多边形各顶点的坐标。
输出:多边形的周长,精确到小数点后2位。
样例1:
输入;
4 0 0 0 1 1 1 1 0
输出:4.00
样例2:
输入: 1 2 3
输出: 0.00
样例3:
输入: 2 2 3 2 4
输出: 1.00
#include<stdio.h>
#include<math.h>
double f(double x,double y,double m,double n);
int main(void)
{
double b,c,d,e,u,v;//题目要求点的输入格式为double
int k,a;
float sum=0;
scanf("%d",&a);
if(a==1)//a为一的情况
{
scanf("%lf %lf",&b,&c);
printf("0.00");
}
else
{
scanf("%lf %lf",&b,&c);//利用循环读取
u=b;v=c;
for(k=(a-1);k>0;k--)
{
scanf("%lf %lf",&d,&e);
sum+=f(b,c,d,e);
b=d;
c=e;
}
//printf("%d\n",a);
if(a>=3)//a>2时要考虑首尾点间的距离
{
sum+=f(u,v,d,e);
}
printf("%.2lf",sum);
}
}
double f(double x,double y,double m,double n)//求两点间距离
{
double f;
f=sqrt((x-m)*(x-m)+(y-n)*(y-n));
//printf("%f\n",f);
return f;
}
5. (程序题)
题目编号:Exp03-Extend01,GJBook3-12-04
题目名称:自守数
题目描述:若一个正整数a满足条件 a^2 的尾数等于a,则称a为自守数,例如:
25^2=625 、76^2=5776 、9376^2=87909376 都是自守数。
编写程序,求小于等于n的所有自守数。
输入:从键盘随机输入一个正整数n(不超过10000000)。
输出:输出小于等于n的所有自守数,每个数之间以一个西文空格间隔。
样例1:
输入:10
输出:1 5 6
样例2:
输入:100
输出:1 5 6 25 76
#include<stdio.h>
long long g(long long x);
int main(void)
{
long long m,j,a,b,k;//必须用long long才能通过
long n;
scanf("%ld",&n);
printf("1");//先输出1以控制格式
for(k=2;k<n;k++)//从2开始保证没有多的1
{
m=k*k;
a=10000000;//不要用while算a,会超时,题目已给出a的大小
for(j=a;j>0;j/=10)
{
b=m%j;
if(b==k)
{
printf(" %ld",k);//注意空格
break;//跳出循环保证不会出现多次一个数
}
}
}
return 0;
}
6. (程序题)
【计2014级期中试题】素数判断。
问题描述:一个大于1的自然数,只能被1和它本身整除,不能被其它除0以外的自然数整除,则该数称之为素数。编写函数,判断一个整数是否为素数。
注:判断素数部分必须编写成一个独立于main()函数的其它函数。
输入:一个大于1的自然数
输出:根据是否是素数输出Y/N
样例1:
输入:3
输出:Y
样例2:
输入:51
输出:N
#include<stdio.h>
int IsPrime(int x);
int main(void)
{
int n;
scanf("%d",&n);
IsPrime(n);
return 0;
}
int IsPrime(int x)
{
int k,m=0;
for(k=2;k<x;k++)//注意k从2开始
{
if((x%k)==0)
m=0;
else
m++;
}
if(m==(x-2))
printf("Y");
else
printf("N");
return 0;//返回值为0
}