1.6.3习题解答
编程题
1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主调函数调用这两个函数,并输出结果。两个整数由键盘输入。
分析:
求两个数a和b的最大公约数:
设这个数为x,则x一定小于等于a和b中的较小者min(a,b)。在区间[1, min(a,b)]中能到的最后一个同时被a和b整除的那个数,就是a和b的最大公约数x。
求两个数a和b的最小公倍数:
设这个数为x,则x一定大于等于a和b中的较大者max(a,b),而小于等于a*b。在区间[max(a,b), a*b ]中到的第一个能同时整除a和b的那个数,就是a和b的最小公倍数x。
参考程序代码:
#include "stdio.h"
f1(int a, int b)/*求最大公约数*/
{
int x,i;
for(i=1;i<=(a<=b?a:b);i++)
{
if(a%i==0&&b%i==0)
{
x=i;
}
}
printf("\n最大公约数为: %d\n",x);
}
f2(int a, int b)/*求最小公倍数*/
{
int i,x;
for(i=((a>b)?a:b);i<=a*b;i++)
{
if(i%a==0&&i%b==0)
{
x=i;
break;
}
}
printf("\n最小公倍数为: %d\n",x);
}
void main()
{
int a,b;
printf("\n请输入两个数:\n");
printf("a=");scanf("%d", &a);
printf("b=");scanf("%d", &b);
f1(a, b);
f2(a, b);
}
运行结果:
请输入两个数:
a=4
b=16
最大公约数为:4
最小公倍数为:16
2.编写一个函数,其功能是对于给定的一个时间数(秒为单位),以“时:分:秒”的格式输出。
参考程序代码:
#include <stdio.h>
print_time(long second)
{
int hour,minute;
hour=(second/3600)%24;
second%=3600;
minute=second/60;
second%=60;
printf("%d:%d%ld\n", hour, minute, second);
}
void main()
{
long s;
printf("请输入秒数:");
scanf("%ld", &s);
print_time(s);
}
运行结果:
请输入秒数:7278
2:1:18
3.编写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。
分析:
素数指的是是指该数除了1和本身,不再有其他因子。考虑到完全平方数的因素,只需要考
察从2到该数的平方根这个区间,如果该区间中没有因子,则该数是素数,否则不是素数。
参考程序代码:
#include "stdio.h"
#include "math.h"
f(int x)/*判断x是否素数*/
{
int i,sign=0;;
for(i=2;i<=(int)sqrt(x);i++)
{
if(x%i==0)
{
++sign;
break;
}
}
if(sign!=0)
printf("\n该数不是素数\n");
else
printf("\n该数是素数\n");
}
void main()
{
int a;
printf("请输入一个整数:\n");
scanf("%d",&a);
f(a);
}
运行结果:
请输入一个整数:
7
该数是素数
4. C语言中在函数之间进行数据传递的方法除了通过返回值和全局变量外,还可以采用哪种方式?请以求两个数中的较大者为例,分别编程实现。
分析:
函数之间传递数据的方法一般有三种方式:
a) 通过返回值
b) 通过全局变量
c) 通过函数调用的实参
代码请自行实现。
5.用递归算法求下列函数的值。
注意选择好合适的参数类型和返回值类型。在main()函数中,输入下列三组数据:
(a)n=0,x=7; (b)n=1,x=2; (c)n=3,x=4求出相应的函数值。
分析:
该函数为分段函数,当n>1时为勒让德多项式,可以利用函数的递归调用求其值。
参考程序代码:
#include "stdio.h"
double pn(double x, int n)
{
if(n==0) return 1;
if(n==1) return x;
return 1.0*((2*n-1)*x-pn(x,n-1)-(n-1)*pn(x,n-2))/n;
}
main()
{
double pn(double x,int n);
double x;
int n;
printf("\n请输入参数x与n\n");
printf("x=");scanf("%lf",&x);
printf("\nn=");scanf("%d",&n);
printf("函数值为: %lf\n",pn(x,n));
}
运行结果:
6.写一个函数,输入一个十六进制数,输出相应的十进制数。
参考程序代码:
#include "stdio.h"
#include "string.h"
int translat(char c)
{
if(c<='9'&&c>='0') return c-'0';
if(c>='a' && c<='f') return c-87;
if(c>='A' && c<='F') return c-55;
return -1;//其他字符返回-1
}
int Htoi(char *str)
{
int i,stat,n=0;
int length=strlen(str);
if(length==0) return 0;
for(i=0;i<length;i++)
{
stat=translat(str[i]);//防错处理
if(stat>=0) n=n*16+stat;
}
return n;
}
void main()
{
char Hex[20];
printf("输入十六进制数:");
gets(Hex);
printf("相应的十进制数为:%d",Htoi(Hex));
}
运行结果:
输入十六进制数:10
相应的十进制数为:16
7.输入一个整数,将它逆序输出。要求定义并调用函数reverse(number),它的功能是返回number的逆序数。例如,reverse(12345)的返回值是54321。
参考程序代码:
#include <stdio.h>
reverse(int number)
{
printf("\n该数的逆序数为:\n");
while (number > 0)
{
//num大于0就不停循环
printf("%d",number%10); //输出个位
number /= 10; //除以10
}
printf("\n");
}
void main()
{
int num;
printf("\n请输入您的数据:\n");
scanf("%d",&num);
reverse(num);
}
运行结果:
请输入您的数据:
12345
该数的逆序数为:
54321
8.编写一个函数,出任一整数的全部因子。
参考程序代码:
#include "stdio.h"
f(int x)/*出x的所有因子*/
{
int i;
printf("\n该数的所有因子为:\n");
for(i=1;i<=x;i++)
{
if(x%i==0)
{
printf(" %d", i);
}
}
}
void main()
{
int a;
printf("请输入一个整数:\n");
scanf("%d",&a);
f(a);
}
运行结果:
请输入一个整数:
10
该数的所有因子为:
1 2 5 10
9.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。N的位数不确定,可以是任意位数的整数。
参考程序代码:
#include "stdio.h"
void convert(n)
int n;
{
int i;
if((i=n/10)!=0)
convert(i);
putchar(n%10+'0');
}
main()
{
int number;
printf("\n输入整数:");
scanf("%d",&number);
printf("\n输出是:");
if(number<0)
{
putchar('-');
number=-number;
}
convert(number);
}
运行结果:
输入整数:2345
输出是:2345
10.给出年、月、日,计算该日是该年的第几天。
分析:主函数接收从键盘输入的日期,并调用sum_day和leap函数计算天数。其N-S图见图。sum_day计算输入日期的天数。leap函数返回是否是闰年的信息。
参考程序代码:
#include "stdio.h"
static int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int sum_day(month,day)
int month,day;
{
int i;
for(i=1;i<month;i++)
day+=day_tab[i];
return(day);
}
int leap(year)
int year;
{
int leap;
leap=year%4==0 && year%100!=0 || year%400 ==0;
return(leap);
}
main()
{
int year,month,day;
int days;
printf("\n请输入日期(年,月,日)\n");
scanf("%d, %d, %d", &year, &month, &day);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论