C语言 HIT苏小红版)第七章练习代码
P156代码例7.4 计算组合数
#include <stdio.h>
#include <stdlib.h>
unsigned long Fact(unsigned int n){
unsigned int i;
unsigned long result=1;
for(i=2; i<=n; i++)
result *=i ;
return result;
}
int main(void){
int m,k;
unsigned long p;
do{
printf("input m,k (m>=k>0):");
scanf("%d,%d",&m,&k);
}while(m<k||m<=0||k<0);
p = Fact(m) / (Fact(k)* Fact(m-k));
printf(" p=%lu\n",p);
return 0;
}
P186 7.5输出1到n的阶乘
#include <stdio.h>
#include <stdlib.h>
unsigned long Fact(unsigned int n){
unsigned int i;
unsigned long result=1;
for(i=2; i<=n; i++)
result *=i ;
return result;
}
int main(void){
unsigned long p;
int n;
do{
printf("please inter a number:");
scanf("%d",&n);
}while(n<=1);
for(int p=1;p<=n;p++)
printf("%d!=%lu\n",p,Fact(p));
return 0;
}
P186 7.6输出1到n的阶乘和
#include <stdio.h>
#include <stdlib.h>
unsigned long Fact(unsigned int n){
unsigned int i;
unsigned long result=1;
for(i=2; i<=n; i++)
result *=i ;
return result;
}
int main(void){
unsigned long p;
int n;
do{
printf("please inter a number:");
scanf("%d",&n);
}while(n<=1);
int sum=0;
for(int p=1;p<=n;p++)
sum+=Fact(p);
printf("1!+...+%d!=%lu",n,sum);
return 0;
}
P186 7.7穷举法找最大公约数
#include <stdio.h>
#include <stdlib.h>
int findgcd(int n1,int n2){
int s;
if(n1>n2){
s=n2;
n2=n1;
n1=s;
}
s=n1;
while(s>0){
if (n2%s==0&&n1%s==0)
return s;
else
s--;
}
}
int main(void){
int a,b;
char c;
printf("please inter two numbers(a,b):");
scanf("%d %c%d",&a,&c,&b);
printf("%d",findgcd(a,b));
return 0;
}
7.7辗转相除法求最大公约数
#include <stdio.h>
#include <stdlib.h>
int findgcd(int n1,int n2){
int r;
int s;
if(n1>n2){
s=n2;
n2=n1;
n1=s;
}//n1是小的那个
r=n2%n1;
if(r!=0){
findgcd(r,n1);//让余数和小的再递归
}
else return n1;
}
int main(void){
int a,b;
char c;
printf("please inter two numbers(a,b):");
scanf("%d %c%d",&a,&c,&b);
printf("%d",findgcd(a,b));
return 0;
}
7.7 利用两数差值部分也必为最大公因子的因式
#include <stdio.h>
#include <stdlib.h>
void swap(int* t1,int* t2){
int p;
//printf("t1=%d,t2=%d\n",*t1,*t2);
if(*t1<*t2){//小的是t2
p=*t1;
*t1=*t2;
*t2=p;
}
}
int findgcd(int n1,int n2){
swap(&n1,&n2);
//printf("n1=%d,n2=%d\n",n1,n2);
int s;
if(n1%n2!=0){
s=n1-n2;
findgcd(s,n2);
}
else
return n2;
}
int main(void){
int a,b;
char c;
printf("please inter two numbers(a,b):");
scanf("%d %c%d",&a,&c,&b);
printf("mcn=%d\n",findgcd(a,b));
return 0;
}