算法入门经典 第四章

程序4-1 组合数Cn^m
#include<stdio.h>
#include<string.h>
#define maxn 10005
long long C(int n,int m);
int ans[maxn];
int main()
{
long long m=C(4,2);
printf("%ld",m);
return 0;
}

long long C(int n,int m)
{
if(m<n-m) m=n-m;
long long ans=1;
for(int i=m+1;i<=n;i++) ans*=i;
for(int i=1;i<=n-m;i++) ans/=i;
return ans;
}

程序4-2 素数判定

#include<stdio.h>
#include<string.h>
#include<math.h>
#define maxn 10005
int is_prime(int n);
int main()
{
long n=7;
long long m=is_prime(n);
if(m)
printf("%d是素数",n);
else
printf("%d不是素数",n);
return 0;
}
//素数 大于1的,只能被1和它自身整除的数
int is_prime(int n)
{
if(n<=1) return 0;
//floor(x+0.5) 对x进行四舍五入 另一方面页避免重复计算 sqrt(n)
int m=floor(sqrt(n)+0.5);
for(int i=2;i<=m;i++)
if(n%i==0) return 0;
else return 1;
}


程序4-6 交换两个数

#include<stdio.h>
#include<string.h>
void swap(int *a,int *b);
int main()
{
int a=3,b=4;
swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
void swap(int *a,int *b)
{
int t=*a;*a=*b;*b=t;
//改成 int *t=*a,*a=*b;*b=*t是错误的
//t存储的地址是什么,如果这个不确定的值代表的内存单元是恰能写入的,那这段程序将正常工作,如果是只读的,程序可能崩溃
}

程序4-9 计算左闭右开的元素和
#include<stdio.h>
#include<string.h>
//变指针的指向
int sum(int *begin,int *end)
{
int *p=begin;
int ans=0;
for(int *p=begin;p!=end;p++)
{
ans+=*p;
}
return ans;
}
int main()
{
int a[]={1,2,3,5,3,5};
int m=sum(a+1,a+4);
printf("%d",m);
return 0;
}


//算出元素的个数
#include<stdio.h>
#include<string.h>
int sum(int *begin,int *end)
{
int n=end-begin;
int ans=0;
for(int i=0;i<n;i++)
{
ans+=begin[i];
}
return ans;
}
int main()
{
int a[]={1,2,3,5,3,5};
int m=sum(a+1,a+4);
printf("%d",m);
return 0;
}

原文地址:https://www.cnblogs.com/is-Tina/p/7338631.html