C程序设计经典程序举例

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C程序设计经典程序举例

1、判断素数(循环、利用算法减少运算次数)

例:1159:质因数分解

正整数n是两个不同质数的乘积,试求出其中较大的。

#include

#include

int main()

{

long long n,big;

int small;

int root,i,j;

scanf("%lld",&n);

for(small=2;small<=(int)sqrt(n);)

{

//素数判断过程,从最小素数开始

root=(int)sqrt(small);

for(i=2;i<=root+1;i++)

{

if(small%i==0)break;

}

if(i<=root)

if(small==2)small++;

else small+=2;

//只判断2和奇数,减少运算次数 continue;

}

if(n%small==0)

{

big=n/small;

root=(int)sqrt(big);

for(i=2;i<=root+1;i++)

{

if(big%i==0)break;

}

if(i<=root)

{

if(small==2)small++;

else small+=2;

continue;

}

else

{

break;

//得到最大质因数,跳出循环 }

}

printf("%d %lld",small,big);

return 0;

}

2、递归与回溯算法(解决尝试性问题,每一级都对下一级有影响)

例:1085:0/1迷宫问题

给定一个由0(表示墙壁)和1(表示道路)的迷宫,请你判断进入迷宫后,仅通过横向和纵向的行走是否能从迷宫中走出来,即能否从坐标(1,1)走到(n,m)。

#include

#include

int starti,startj;

int endi,endj;

//定义迷宫起止点

int success=0;

//用于判断是否成功通路

int main()

{

int visit(int i,int j,int maze[][10]); int i,j;

int n,m;

int maze[10][10];

scanf("%d %d",&n,&m);

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

{

scanf("%d",&maze[i][j]);

}

starti=1,startj=1,endi=n,endj=m;

if(visit(starti,startj,maze)==0)

{

printf("NO");

}

else

{

printf("YES");

}

return 0;

}

int visit(int i,int j,int maze[][10])

{

maze[i][j]=-1;

//安全性判断已经经过的路

if(i==endi&&j==endj)

{

success=1;

//成功到达终点

}

//进行四个方向的尝试

if(success!=1&&maze[i][j+1]==1) {

visit(i,j+1,maze);

}

if(success!=1&&maze[i+1][j]==1) {

visit(i+1,j,maze);

}

if(success!=1&&maze[i-1][j]==1) {

visit(i-1,j,maze);

}

if(success!=1&&maze[i][j-1]==1) {

visit(i,j-1,maze);

}

maze[i][j]=0;

//尝试失败返回0,尝试成功返回1

return success;

}

例:全排列问题

输入一个正整数n,按字典序打印其全排列#include

int used[16]={0};

//是否使用判断

int result[16]={0};

//打印结果

void proc(int step,int n)

{

//按步进行数组赋值

int i;

if(step>n)

{

for(i=1;i<=n;i++)

{

printf("%d ",result[i]);

}

printf("\n");

}

else

{

for(i=1;i<=n;i++)

{

if(used[i]==0)

{

result[step]=i;

used[i]=1;

proc(step+1,n);

used[i]=0;

//回溯

}

}

}

}

int main()

{

相关文档
最新文档