c++&&java算法合集————来一起刷题把!!

c++

1.输入月数输出兔子数目

代码:

#include <stdio.h>

int main()
{
	int i,d1=1,d2=1;
	int d3=0;
	int mon=0;
	printf("请输入要计算的月数:");
	scanf("%d",&mon);
	
	if(mon<=2)
	{
		printf("第%d月共有1对兔子。\n",mon);
	}
	else
	{
		for(i=3;i<=mon;i++)
		{
			d3=d1+d2;
			d1=d2;
			d2=d3;
		}
		printf("第%d月共有%d对兔子。\n",mon,d3);	
	}

	return 0;
}

效果
在这里插入图片描述

2.两个数的最大公约数

#include <stdio.h>

int main()
{
	int a,b,c=0;
	printf("请输入两个数:");
	scanf("%d %d",&a,&b);

	if(a==0 || b==0)
	{
		printf("数据错误!");
		return 0;
	}
	else
	{
		c=a%b;
		if(c==0)
		{
			printf("这两个数的最大公约数为%d\n",b);
		}
		else
		{
			while(c)
			{
				a=b;
				b=c;
				c=a%b;		
			}
			printf("这两个数的最大公约数为%d\n",b);
		}
	}
	return 0;
}

效果
在这里插入图片描述

3.桃子问题

#include <stdio.h>

int main()
{
	int peach=1;
	int day=0;
	
	for(day=10;day>1;day--)
	{
		peach=(peach+1)*2;
	}
	printf("原有%d个桃\n",peach);
	return 0;
}

效果
在这里插入图片描述

4.杨辉三角问题

#include <stdio.h>

int main()
{
	int h,l,i,a[100];
	int f=1;
	printf("请输入要求的杨辉三角形的行数:");
	scanf("%d",&i);
	printf("%5d\n",f);
	a[1]=a[2]=1;	
	printf("%5d %5d\n",a[1],a[2]);
	for(h=3;h<=i;h++)
	{
		a[h]=a[1]=1;
		for(l=h-1;l>1;l--)
		{
			a[l]+=a[l-1];
		}
		for(l=1;l<=h;l++)
		{
			printf("%5d ",a[l]);
		}
		printf("\n");
	}

	return 0;
}

效果:
在这里插入图片描述

5.加油站的问题

#include <stdio.h>

int main()
{
	int distance=500,oil=500,k=1;
	int d=0;
	do
	{
		printf("加油站%5d,距离%5dkm,油量:%5d加仑\n",k,distance,oil);
		k++;
		distance=distance+500/(2*k-1);
		oil=k*500;
	}while(distance<1000);

	oil=500*(k-1) + (1000-distance) * (2*k-1);
	printf("加油站%5d,距离%5dkm,油量:%5d加仑\n",k,d,oil);

	return 0;
}

效果:
在这里插入图片描述

6.求方程根

#include <stdio.h>
#include <math.h>

float a,b,c,d;
float f(float a,float b,float c,float d)
{	
	float x1=1,x0,f0,f1;
	do
	{
		x0=x1;
		f0=((a*x0+b)*x0+c)*x0+d;
		f1=(3*a*x0+2*b)*x0+c;
		x1=x0-f0/f1;
	}while(fabs(x1-x0)>=1e-4);

	return x1;
}

int main()
{
	float fx;
	printf("请输入系数a,b,c,d:");
	scanf("%f%f%f%f",&a,&b,&c,&d);
	fx=f(a,b,c,d);
	printf("方程的根为:%f\n",fx);
	return 0;
}

效果:
在这里插入图片描述

7.已知f(a)*f(b)<0,求方程的根

#include <stdio.h>
#include <math.h>

int main()
{
	float a,b,x,x1=0,x2=2,f1,f2,f;
	
	printf("请输入a,b两个数,已知f(a)*f(b)<0:");
	scanf("%f%f",&a,&b);
	x1=a;
	x2=b;
	f1=x1*x1*x1/2+2*x1*x1-8;
	f2=x2*x2*x2/2+2*x2*x2-8;
	printf("%f\n",f1);
		printf("%f\n",f2);
	if(f1*f2>0)
	{
	
		printf("无实根");
		return 0;
	}
	else
	{
		do
		{
			x=(x1+x2)/2;
			f=x*x*x/2+2*x*x-8;
			if(f==0)
				break;
			if(f1*f>0.0)
			{
				x1=x;
				f1=x1*x1*x1/2+2*x1*x1-8;
			}
			else
			{
				x2=x;
			}
		}while(fabs(f)>=1e-4);
		printf("方程的根为:%f\n",x);
	}

	return 0;
}

效果:
在这里插入图片描述

8.两个数之间的完数个数

如果一个数恰好等于它的因子之和,则称该数为“完全数”。

#include <stdio.h>
#include <math.h>
#define mm 10009



int ans[mm];
bool is_ok(int m)
{
	int i;
	int sum=0;
	int ms=(int)sqrt((float)m)+1;
	for(i=2;i<ms;i++)
	{
		if(m%i==0)
			sum+=i+m/i;
	}
	sum++;
	if(sum==m)
		return true;
	else
		return false;
}

int main()
{
	int i;
	ans[1]=1;
	for(i=1;i<10000;i++)
	{
		if(is_ok(i))
			ans[i]=ans[i-1]+1;
		else
			ans[i]=ans[i-1];
	}

	int a,b;
	
	printf("请输入数a,b:");
	scanf("%d %d",&a,&b);
	if(a>b)
	{
		int z;
		z=a;
		a=b;
		b=z;
	}
	printf("这两个数之间完数的个数为:%d \n",ans[b]-ans[a-1]);
	
	
	return 0;
}

在这里插入图片描述

9.金块问题的二分查找

#include <stdio.h>

int f(int l,int r,int a[])
{
	int center;
	int	max1;
	int	max2;

	if(l==r)
		return l;
	else
	{
		center=(l+r)/2;

		max1=f(l,center,a);
		max2=f(center+1,r,a);

		if(max1 > max2)
			return max1;
		else
			return max2;
	}
}

int g(int l1,int r1,int a1[])
{
	int center1;
	int min1;
	int min2;

	if(l1==r1)
		return l1;
	else
	{
		center1=(l1+r1)/2;

		min1=g(l1,center1,a1);
		min2=g(center1+1,r1,a1);

		if(min1 < min2)
			return min1;
		else
			return min2;
	}	
}

int main()
{
	int b[]={1,3,6,7,4,2,5,8,9};
	int c;
	c=f(b[0],b[8],b);
	printf("最优秀的雇员所得金块重量为%dkg\n",c);
	int e;
	e=g(b[0],b[8],b);
	printf("最差的雇员所得金块重量为%dkg\n",e);
	return 0;
}

效果:

在这里插入图片描述

10求最大字段和

#include <stdio.h>

int max_sub_sum(int a[],int left,int right)
{
	int center,i,j,sum,left_sum,right_sum,s1,s2,lefts,rights;
	if(left==right)
	{
		if(a[left]>0)
			return a[left];
		else
			return 0;
	}
	else
	{
		center=(left+right)/2;
		left_sum=max_sub_sum(a,left,center);
		right_sum=max_sub_sum(a,center+1,right);

		s1=0;
		lefts=0;
		for(i=center;i>=left;i--)
		{
			lefts=lefts+a[i];
			if(lefts>s1)
				s1=lefts;
		}
		s2=0;
		rights=0;
		for(i=center+1;i<=right;i++)
		{
			rights=rights+a[i];
			if(rights>s2)
				s2=rights;
		}
		if(s1+s2<left_sum && right_sum<left_sum)
			return left_sum;
		if(s1+s2<right_sum)
			return right_sum;

		return (s1+s2);
	}
}

int max_sum3(int a[],int n)
{
	return (max_sub_sum(a,1,n));
}

int main()
{
	int b[]={-2,11,-4,13,-5,-2};
	int c;
	c=max_sum3(b,3);
	printf("最大字段和为%d\n",c);

	return 0;
}

效果:
在这里插入图片描述

11.数组中第?小的数

#include <stdio.h>

int select(int a[],int left,int right,int k)
{
	if(left>=right)
		return a[left];
	int i=left;
	int j;
	j=right=1;
	int pivot=a[left];
	while(1)
	{
		do
		{
			i++;
		}while(a[i]<pivot);
		do
		{
			j--;
		}while(a[i]>pivot);

		if(i>=j)
			break;
	}

	int temp;
	temp=a[i];
	a[i]=a[j];
	a[j]=temp;

	if(j-left+1==k)
		return pivot;
	a[left]=a[j];
	a[j]=pivot;

	if(j-left+1<k)
		return select(a,j+1,right,k-j-1+left);
	else
		return select(a,left,j-1,k);
}

int xzwt(int a[],int n,int k)
{
	if(k<1 || k>n)
		return select(a,0,n-1,k);
}

int main()
{
	int b[]={7,8,4,6,1,3,5,2,9};
	int m;
	int i;
	printf("请输入要求的第几小的数:");
	scanf("%d",&m);
	i=xzwt(b,8,m);
	printf("数组中第%d小的数为%d\n",m,i);
	return 0;
}

效果:
在这里插入图片描述

12.分数通分

#include <stdio.h>

int main()
{
	int a,b,c;
	printf("请输入分子:");
	scanf("%d",&a);
	printf("请输入分母:");
	scanf("%d",&b);
	if(a>b)
	{
		printf("输入错误!");
	}
	else if(a==1 || b%a==0)
	{
		printf("%d/%d=1/%d ",a,b,b/a);
	}
	else
	{
		while(a!=1)
		{
			c=b/a+1;
			a=a*c-b;
			b=b*c;
			printf("1/%d",c);
			if(b%a==0)
			{
				printf(" + 1/%d ",b/a);
				a=1;
			}
			if(a>1)
			{
				printf(" + ");
			}
		}
	}
	return 0;
}

效果:
在这里插入图片描述

13.用递归求数字三角形的最大值

#include <stdio.h>

int a[5][5]= {  {9},
				{12,15},
				{10, 6, 8},
				{ 2,18, 9, 5},		
				{19, 7,10, 4,16} };

int n=5;//数字三角形行数 

int MaxSum(int i,int j)
{
	if (i == n)
	{
		return a[i][j];
	}
 
	int LeftSum = MaxSum(i+1,j);
	int RightSum = MaxSum(i+1,j+1);
 
	if(LeftSum > RightSum)
	{
		return LeftSum + a[i][j];
	}
	else
	{
		return RightSum + a[i][j];
	}
}

int main()
{
	int flag=MaxSum(0,0);
	printf("%d",flag);
	
	return 0;
}

效果:
在这里插入图片描述

14.利用动态规划求数字三角形的最大值

#include <stdio.h>

int tri[5][5]={ {9},
				{12,15},
				{10, 6, 8},
				{ 2,18, 9, 5},		
				{19, 7,10, 4,16} };

int triangle(int n)
{
	int i,j;
	for(i=n-2;i>=0;i--)
	{
		for(j=0;j<=i;j++)
		{
			if(tri[i+1][j]>tri[i+1][j+1])
			{
				tri[i][j]+=tri[i+1][j];
			}
			else
			{
				tri[i][j]+=tri[i+1][j+1];
			}
		}
	}
	return tri[0][0];
}

int main()
{
	triangle(5);
	int m,n;
	
	for(m=0;m<5;m++)
	{
		for(n=0;n<m+1;n++)
		{
			printf("%3d ",tri[m][n]);
		}
		printf("\n");
	}
	return 0;
}

效果:
在这里插入图片描述

15.利用动态规划求最大字段和

#include <stdio.h>

int maxsum(int n,int a[])
{
	int sum=0;
	int b=0;
	int begin=0;
	int i,bi,bj;
	for(i=0;i<n;i++)
	{
		if(b>0)
		{
			b+=a[i];
		}
		else
		{
			b=a[i];
			begin=i;
		}
		
		if(b>sum)
		{
			sum=b;
			bi=begin;
			bj=i;
		}
	}
	return sum;
}

int main()
{
	int s[8]={1,-3,7,8,-4,12,-10,6};
	int flag=maxsum(8,s);
	printf("最大字段和为%d",flag);
	
	return 0;
}

效果:
在这里插入图片描述

16.蛮力算法求最大字段和

#include <stdio.h>
//int maxsum(int n,int nums[])
//{
//	int sum=0;
//	int i,j,k;
//	
//	for(i=0;i<n;i++)
//	{
//		for(j=i;j<n;j++)
//		{
//			int thissum = 0;
//			for(k=i;k<j;k++)
//			{
//				thissum += nums[k];
//			}
//			if(thissum>sum)
//			{
//				sum=thissum;
//			}
//		}
//	}
//	return sum;
//}
int main()
{
	//  int flag=maxsum(8,a);
	int a[8]={1,-3,7,8,-4,12,- 10,6};
    int sum=0;
	
	for(int i=0;i<8;i++)
	{
		for(int j=i;j<8;j++)
		{
			int thissum = 0;
			for(int k=i;k<j;k++)
			{
				thissum += a[k];
			}
			if(thissum>sum)
			{
				sum=thissum;
			}
		}
	}
	
	printf("最大字段和为%d",sum);
	return 0;
}

效果:
在这里插入图片描述

17.动态规划求最大递增子序列长度

#include <stdio.h>

int a[8]={1,3,4,2,7,9,6,8};

int lis(int n)
{
	int b[100] = {0};
	b[0] = 1;
	int max=0;
	int i,j;
	
	for(i=1;i<n;i++)
	{
		int k=0;
		for(j=0;j<i;j++)
		{
			if(a[j]<=a[i] && k<b[j])
			{
				k=b[j];
			}
			
			b[i]=k+1;
			
			if(max<b[i])
			{
				max=b[i];
			}
		}
	}
	return max;
}

int main()
{
	int flag=lis(8);
	printf("最大递增子序列长度为%d",flag);
}

效果:
在这里插入图片描述

18.回溯解决n皇后问题

#include <stdio.h>
#include <math.h>
#include <stdlib.h> 
int x[100];

bool place(int k)//判断是否冲突 
{
	for(int i=1;i<k;i++)
	{
		if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k]))
			return false;
	}
	return true;
}

int queen(int n)//n为皇后个数 
{
	int count=0;//方案个数 
	
	for(int i=1;i<=n;i++)
		x[i]=0;
	
	int k=1;//行数 
	while(k>=1)
	{
		x[k]+=1;//在同一行的各列找合适的位置 
		
		while( x[k]<=n && !(place(k)) )//下一列 
			x[k]+=1;
		
		if(k==n && x[k]<=n)
		{
			count++;
			
			for(int i=1;i<=k;i++)
			{
				printf("%d ",x[i]);
			}
			printf("\n");
		}
		else if(k<n && x[k]<=n)//下一行 
		{
			k+=1;
		}
		else
		{
			x[k]=0;
			k-=1;//回溯 
		}
	}
	printf("共有%d种方案。\n",count);
	return count;
}

int main()
{
	int n;
	
	printf("请输入皇后的个数:");
	scanf("%d",&n);
	printf("%d皇后的解如下:\n",n);
	queen(n);
}

效果:
在这里插入图片描述

19.回溯解决素数环问题

#include <stdio.h>
#include <math.h>
int place[100];

int prime(int x)//判断整数x是否为素数 
{
	int i,n;
	n=(int)sqrt(x);
	for(i=2;i<=n;i++)
	{
		if(x%i==0)
			return 0;
	}
	return 1;
}

int chk(int k,int place[],int n)
{
	for(int i=0;i<k;i++)
	{
		if(place[i]==place[k])
		{
			//数字放置重复
			return 0; 
		}
	}
	//判断前后两数之和是否为素数
	int flag=prime(place[k-1]+place[k]);
	//判断环的第一个数和最后一个数的和是否为素数
	if(flag==1 && k==n-1)
	{
		flag=prime(place[0]+place[k]);
	} 
	return flag;
}

void PC(int n)
{
	for(int i=0;i<=n-1;i++)
	{
		place[i]=0;
	}
	
	int k=1;
	
	place[0]=1;
	
	while(k>=1)
	{
		place[k]++;
		
		while(place[k]<=n)
		{
			//判定位置k能否放置数字place[k]
			if(chk(k,place,n))
			{
				break;
			}
			else
			{
				place[k]++;//尝试放置下一个数 
			}
		}
		if(place[k]<=n && k==n-1)//找到一种放置方法 
		{
			for(int i=0;i<n;i++)
			{
				printf("%d ",place[i]);
			}
			return;
		}
		if(place[k]<=n && k<n)
		{
			//开始放置下一个位置 
			k++;
		}
		else
		{
			//前0~k-1个位置的放置方式导致当前位置k无法放置符合要求的数,开始回溯
			place[k]=0;
			k--; 
		}
	}
}

int main()
{
	int n;
	printf("请输入数字个数(偶数):");
	scanf("%d",&n);
	PC(n);
	return 0;
}

效果:
在这里插入图片描述

20.回溯解决桥本分数问题

#include <stdio.h>

int main()
{
	int a[10];
	int count=0;
	int i=1;
	a[1]=1;
	
	while(true)
	{
		int flag=1;
		
		for(int k=i-1;k>=1;k--)
		{
			if(a[i]==a[k])
			{
				flag=0;
				break;
			}
		}
		
		if(i==9 && flag==1 && a[1]<a[4])
		{
			int s1=10*a[2]+a[3];
			int s2=10*a[5]+a[6];
			int s3=10*a[8]+a[9];
			
			if(a[1]*s2*s3+a[4]*s1*s3==a[7]*s1*s2)
			{
				count++;
				printf("%d/%d + %d/%d = %d/%d\n",a[1],s1,a[4],s2,a[7],s3);
			} 
		}
		
		if(i<9 && flag==1)
		{
			i++;
			a[i]=1;
			continue;
		}
		
		while(a[i]==9 && i>1)
		{
			i--;
		}
		
		if(a[i]==9 && i==1)
			break;
		else
			a[i]++;
	}
	return 0;
}

效果:
在这里插入图片描述

21.回溯解决0-1背包问题

#include <stdio.h>

int main()
{
	int a[10];
	int count=0;
	int i=1;
	a[1]=1;
	
	while(true)
	{
		int flag=1;
		
		for(int k=i-1;k>=1;k--)
		{
			if(a[i]==a[k])
			{
				flag=0;
				break;
			}
		}
		
		if(i==9 && flag==1 && a[1]<a[4])
		{
			int s1=10*a[2]+a[3];
			int s2=10*a[5]+a[6];
			int s3=10*a[8]+a[9];
			
			if(a[1]*s2*s3+a[4]*s1*s3==a[7]*s1*s2)
			{
				count++;
				printf("%d/%d + %d/%d = %d/%d\n",a[1],s1,a[4],s2,a[7],s3);
			} 
		}
		
		if(i<9 && flag==1)
		{
			i++;
			a[i]=1;
			continue;
		}
		
		while(a[i]==9 && i>1)
		{
			i--;
		}
		
		if(a[i]==9 && i==1)
			break;
		else
			a[i]++;
	}
	return 0;
}

效果:
在这里插入图片描述

java

java的算法不多在我的博客里,大家可以去看看

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值