C程序设计经典程序举例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()
{
int n;