算法设计实验1----(循环与递归)[C语言]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法设计实验1----(循环与递归)[C语言]相关的知识,希望对你有一定的参考价值。
实验目的:掌握循环与递归程序设计的技巧与方法,能够根据具体问题,灵活使用循环与递归设计算法,解决问题。
例1计算1/1!-1/3!+1/5!-……
#include<stdio.h>
int main()
{
int i,n,sign;
float s,t=1;
scanf("%d",&n);
s=1;
sign=1;
for(i=2;i<=n;i=i++)
{
sign=-sign;
t=t*(2*i-2)*(2*i-1);
s=s+sign/t;
}
printf("s= %.2f\\n",s);
}
例一算法二:
#include<stdio.h>
int main(){
int i,n,j,sign=1;
float s,t=1;
scanf("%d",&n);
s=1;
for(i=2;i<=n;i++)
{
sign=-sign;
t=t*(2*i-2)*(2*i-1);
s=s+sign/t;
}
printf("Sum=%f\\n",s);
return 0;
}
1000以内的完数:
#include<stdio.h>
int main(){
int i,k,j,s,a[20];
for(i=2;i<=1000;i++)
{
s=1;
k=0;
for(j=2;j<i;j++)
if(i%j==0)
{
s=s+j;
a[k]=j;
k++;
}
if(i==s)
{
printf("%d it's factors are: 1",i);
for(j=0;j<k;j++)
printf(",%d",a[j]);
printf("\\n");
}
}
return 0;
}
求矩阵的鞍点
#include<stdio.h>
int readmtr(int a[][3],int n )
{
int i,j;
printf("input n*n matric:");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
void printmtr(int a[][3],int n)
{
int i,j;
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\\n");
}
}
int main(){
int a[3][3],i,j,k,minj,t,n=3,kz=0;
printf("input n*n matric:");
readmtr(a,n);
printmtr(a,n);
for(i=0;i<n;i++)
{
t=a[i][0];
minj=0;
for(j=0;j<n;j++)
if(a[i][j]<t)
{
t=a[i][j];
minj=j;
}
for(k=0;k<n;k++)
if(a[k][minj]>t)break;
if(k==n)
{printf("the reulst is a[%d][%d]=%d\\n",i,minj,t);
kz=1;
break;}
}
if(kz==0)
printf("Non solution!");
return 0;
}
打印阶梯数组
#include<stdio.h>
int main(){
int i,j,a[100][100],n,k;
scanf("%d",&n);
k=1;
for(i=1;i<=n;i++)
for(j=1;j<=n+1-i;j++)
{
a[i-1+j][j]=k;
k++;
}
for(i=1;i<=n;i++)
{ printf("\\n");
for(j=1;j<=i;j++)
printf("%d ",a[i][j]);
}
return 0;
}
汉诺塔问题
#include<stdio.h>
void hanoi(int n,char a,char b,char c);
int main(){
int n;
scanf("%d",&n);
hanoi(n,'A','B','C');
return 0;
}
void hanoi(int n,char a,char b,char c)
{
if(n>0)
{hanoi(n-1,a,c,b);
printf("Move dish %d from pile %c to %c\\n",n,a,b);
hanoi(n-1,c,b,a);}
}
整数划分
#include<stdio.h>
int Divinteger(int n, int m);
int main(){
int n;
scanf("%d",&n);
printf("%d\\n",Divinteger(n,n));
return 0;
}
int Divinteger(int n, int m){
if(n<1||m<1)
printf("输入参数错误");
else if(n==1||m==1)
return (1);
else if(n<m)
return Divinteger(n,n);
else if(n==m)
return(1+Divinteger(n,n-1));
else
return(Divinteger(n,m-1)+Divinteger(n-m,m));
}
输入整数,从低位到高位输出
- 循环算法
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
while(n>=10)
{printf("%d ",n%10);
n=n/10;
}
printf("%d\\n",n);
return 0;
}
- 递归算法:
#include<stdio.h>
void f(int n);
int main(){
int n;
scanf("%d",&n);
f(n);
return 0;
}
void f(int n){
if(n<10)
printf("%d ",n);
else
{printf("%d ",n%10);
f(n/10);}
}
任给正整数,从高位到低位输出。
- 循环算法
#include<stdio.h>
int main(){
int n,i=0,j,a[16];
scanf("%d",&n);
while(n>=10)
{
a[i]=n%10;
i++;
n=n/10;
}
a[i]=n;
for(j=i;j>=0;j--)
printf("%d ",a[j]);
return 0;
}
- 递归算法:
#include<stdio.h>
void f(int n);
int main(){
int n;
scanf("%d",&n);
f(n);
return 0;
}
void f(int n){
if(n<10)
printf("%d ",n);
else{
f(n/10);
printf("%d ",n%10);
}
}
任何一个正整数都可用2的幂次方表示。
(1)
#include<stdio.h>
void try1(int n,int r);
int main(){
int n;
scanf("%d",&n);
if(n>=1)
try1(n,0);
else
printf("data error");
printf("\\n");
return 0;
}
void try1(int n,int r)
{
if(n==1)
printf("2^%d",r);
else
{
try1(n/2,r+1);
if(n%2==1)
printf("+2^%d",r);
}
}
(2)
#include<stdio.h>
int try1(int n,int r);
int main(){
int n;
scanf("%d",&n);
if(n>=1)
try1(n,0);
else
printf("data error");
return 0;
}
int try1(int n,int r)
{
if(n==1)
switch(r)
{case 0:printf("2(0)");break;
case 1:printf("2");break;
case 2:printf("2(2)");break;
default:printf("2(");try1(r,0);printf(")");
}
else
{
try1(n/2,r+1);
if(n%2==1)
switch(r)
{case 0:printf("+2(0)");break;
case 1:printf("+2");break;
case 2:printf("+2(2)");break;
default:printf("+2(");try1(r,0);printf(")");
}
}
}
找出n个自然数中取出r个数字的组合。
(1)循环算法
#include<stdio.h>
int main(){
int n=5,i,j,k,t;
t=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(i<j&&j<k)
{ t++;
printf("%d %d %d\\n",i,j,k);
}
printf("total=%d\\n",t);
return 0;
}
(2)递归算法:
#include<stdio.h>
int a[100];
void comb(int m,int k)
{
int i,j;
for(i=m;i>=k;i--)
{
a[k]=i;
if(k>1)
comb(i-1,k-1);
else
{for(j=a[0];j>0;j--)
printf("%d ",a[j]);
printf(C语言循环结构实验报告
禅与计算机程序设计艺术使用 16 门编程语言实现斐波那契数列:循环控制指令与函数递归思想