8.1:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输入结果,两个整数用键盘输入(第一种用更相减损术)
#include <stdio.h>
#include <stdlib.h>
int HCF(int x, int y); //定义最大公约数函数
int LCM(int p, int q); //定义最小公倍数函数
int main()
{
int a, b, hcf, lcm;
scanf("%d %d", &a, &b); //输入两个整数
hcf = HCF(a, b); //调用最大公约数函数
lcm = LCM(a, b); //调用最小公倍数函数
printf("最大公因数是:%d\t最小公倍数是:%d\n", hcf, lcm);//输出最大公约数和最小公倍数 //输出最大公约数和最小公倍数
return 0;
}
int sum;//定义外部变量sum
//最大公约数函数-->用更相减损术求得
int HCF(int x, int y)
{
int i, k, m, n;
sum = 1;
k = x > y ? y : x;
i = 2;
while (i <= k){
m = x % i;
n = y % i;
if (m == 0 && n == 0){
sum *= i;
x /= i;
y /= i;
i = 2;
}
else
i++;
}
return sum;
}
//最小公倍数函数
int LCM(int p, int q)
{
int lc;
lc = p * q / HCF(x, y);//最小公倍数等于两数相乘除以最大公因数
return lc;
}
8.1:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输入结果,两个整数用键盘输入(第一种用辗转相除法也叫欧几里得算法)
#include <stdio.h>
#include <stdlib.h>
int HCF(int x, int y); //定义最大公约数函数
int LCM(int x, int y);//定义最小公倍数函数
int main()
{
int a, b,hcf,lcm;
printf("请输入两个整数: ");//输入两个整数
scanf("%d %d", &a, &b);
hcf = HCF(a, b);//调用最大公约数函数
lcm = LCM(a, b);//调用最小公倍数函数
printf("最大公因数是:%d\t最小公倍数是:%d\n", hcf, lcm);//输出最大公约数和最小公倍数
return 0;
}
int HCF(int x, int y){//最大公约数
int swap,z;
if(x<y){
swap=x;
x=y;
y=swap;
}
for (z=x%y; z!=0; ){
//注意每一步循环都要判断一下x和y哪个大,大的除以小的
x=y;y=z;
if(x<y){
swap=x;
x=y;
y=swap;
}
z=x%y;
}
return y;
}
//最小公倍数函数
int LCM(int x, int y)
{
return (x*y)/HCF(x, y);
}
8.2求方程ax2+bx+c=0的根,用三个函数分别来求当b2-4ac大于0,等于0小于0时的根,并输出结果。从主函数输入a,b,c的值
#include<stdio.h>
#include<math.h>
void greatZero(int a,int b,int c,int *y1,int *y2){//大于零
*y1=(sqrt(b*b-4*a*c)-b)/(2*a);
*y2=(-sqrt(b*b-4*a*c)-b)/(2*a);
}
int main(){
//8.2求一元二次方程的解
int a,b,c;
int y1=0,y2=0;
scanf("%d %d %d",&a,&b,&c);
if(b*b-4*a*c>0){//两个解
greatZero(a,b,c,&y1,&y2);
printf("%d %d",y1,y2);
}else if(b*b-4*a*c<0){//无解
printf("无解");
}else{//等于0时有两个相同的解,输出一个即可
greatZero(a,b,c,&y1,&y2);
printf("%d",y1);
}
return 0;
}
8.10写一个函数,输入一行字符,将此字符串中最长的单词输出
#include<stdio.h>
#include<string.h>
void longestword(char s[]);
int main(){
//8.10将最长的字符串输出
int i=0,j=0,z=0;
char c;
char str[1000];//存放字符串的数组
while((c=getchar())!='\n') {//读入字符串
str[i] = c;
i++;
}
longestword(str);
return 0;
}
void longestword(char str[]){
int i=0,j=0;
char t[30];//存储最长单词的数组
char temp[30];//存储最长单词的数组
for(i=0;i<strlen(str);i++) {
j=0;
while(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'){
temp[j++]=str[i++]; //将由非字母字符分割成的每个单词临时储存在temp[]中
}
temp[j]='\0';
if(strlen(t)<strlen(temp)){ //t[]为储存最长单词的字符数组
strcpy(t,temp); //通过比较t、temp字符数组的长度,判断当前最长单词并将其储存在t中
}
}
printf("the longest word:\n");
puts(t);
}
8.13 用递归方法求n阶勒让德多项式的值,递归公式为:
P2(x)=
#include <stdio.h>
double p(int n, int x);//定义求值函数
int main()
{
double r;
int s, y;
scanf("%d %d", &s, &y);//输入值
r=p(s, y);//调用求值函数
printf("%f\n", r);//输出值
return 0;
}
double p(int n, int x){
if (n==0)
return 1;
else if (n==1)
return x;
else
return ((2*n-1)*x-p(n-1, x)-(n-1)*p(n-2, x))/n;//用递归实现
}
8.16写一个函数,输入一个输入一个十六进制的数,输出相应的十进制数
#include <stdio.h>
#include <math.h>
#include <string.h>
//写一个函数,输入一个16进制数,输出相应的十进制数
void convert(char a[]);
int main(){
char a[10];//保存16进制的数
printf("请输入十六进制数:");
gets(a); //输入十六进制数
convert(a);
return 0;
}
void convert(char a[]){
int flag=0;
int i,num;
int len=strlen(a);
for(i=len-1;i>=0;i--) {
if(a[i]>='0'&&a[i]<='9'){
num+=(a[i]-'0')*pow(16,len-1-i); //a[i]-'0'将字符转化为数字
}else if(a[i]>='A'&&a[i]<='F'){
num+=(10+(a[i]-'A'))*pow(16,len-1-i); //10+a[i]-'A'意思:你懂的
}else if(a[i]>='a'&&a[i]<='f'){
num+=(10+(a[i]-'a'))*pow(16,len-1-i);
}else if(a[i]>='g'&&a[i]<='z'||a[i]>='G'&&a[i]<='Z'){
printf("输入有误");
flag=-1;
break;
}
}
if(flag!=-1){
printf("转换十进制为:");
printf("%d",num);
}
}
8.17:用递归将一个整数转化为字符串
#include <stdio.h>
int main(){
void exchange(int n);
int n;
printf("请输入要转化的数字:");
scanf("%d",&n);
printf("转化后的字符串为:\n");
if(n<0){
putchar('-');
n=-n;
}
exchange(n);
printf("\n");
}
void exchange(int n){
int i;
if((i=n/10)!=0)
exchange(i);
putchar(n%10+'0');
}