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的算法不多在我的博客里,大家可以去看看