算法设计实验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 门编程语言实现斐波那契数列:循环控制指令与函数递归思想

算法设计实验2----[算法与数据结构](C语言)

函数和宏定义实验

网易云课堂_C语言程序设计进阶_第五周:递归与简单算法:递归搜索二分搜索简单排序_1逆序输出的数列

网易云课堂_C语言程序设计进阶_第五周:递归与简单算法:递归搜索二分搜索简单排序