算法第一周

算法第一周:

第一个问题:

对于第一个问题,我自己首先想到的是用九重循环,加一个条件及一个判断,然后就可以输出,以下是我的代码:

test1.cpp

#include <stdio.h>
int main(){
  int a,b,c,d,e,f,g,h,i;
  for(a=1;a<10;a++)
    for(b=1;b<10;b++)
      for(c=1;c<10;c++)
        for(d=1;d<10;d++)
          for(e=1;e<10;e++)
            for(f=1;f<10;f++)
              for(g=1;g<10;g++)
                for(h=1;h<10;h++)
                  for(i=1;i<10;i++)
                    {
                      if(a==b||a==c||a==d||a==e||a==f||a==g||a==h||a==i
                         ||b==c||b==d||b==e||b==f||b==g||b==h||b==i
                         ||c==d||c==e||c==f||c==g||c==h||c==i||d==e
                         ||d==f||d==g||d==h||d==i||e==f||e==g||e==h
                         ||e==i||f==g||f==h||f==i||g==h||g==i||h==i)
                        continue;
                      else{
                        if((a*100+b*10+c)*2==d*100+e*10+f&&(a*100+b*10+c)*3==g*100+h*10+i)
                          printf("%d %d %d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
 else
                          continue;
                      }
                    }
  return 0;
}


当程序执行的时候,我发现我这个做法时间复杂度太高,耗时很高,之后就百度了另外两种思路,一种是利用这9个数相加相乘的数是定数来做的;还有一个是用定义了一个数组,先把数组初始化为-1,之后利用t[a]=a,把这个数挑出来,之后会把一开始的数乘以2倍3倍,然后用相同的方法找出abc,def,ghi对应的数;总而言之,比我的做法效率好的很多,具体的可以百度;


第二个问题:

第二个问题,我是想着用一个do while循环做的;就是先用一个数组b[],把每次算出来的和f赋值到数组中,然后每运算一次,就j++;由于最后一次还要输入0 0,所以j一开始是-1;以下是代码:

test2.cpp

#include<stdio.h>
int main(){
  long n,m,t;
  int i;
  int j=-1;
  double b[100]={0};
  int k=0;

  double f=0;
  do{
    j++;
    scanf("%ld %ld",&n,&m);
    if(n>m){
      t=n;
      n=m;
      m=t;
}
    for(i=n;i<=m;i++){

      f +=1.0/i/i;
}
    b[k++]=f;
    f=0;
  }while(m!=0 && n!=0 && m <= 1000000);
 for(i=0;i<j;i++)
    printf("Case %d: %.5lf\n",i+1,b[i]);
    return 0;
}


第三个问题:
对于冒泡排序,就是一趟一趟的比较两个相邻的数的大小,然后按照要求交换位置,最后输出,以下是代码:

test3.cpp

#include<stdio.h>
int main(){
  int x[100];
  int i,j,t,n;
  printf("请输入n:");
  scanf("%d",&n);
  printf("请输入n个数:\n");
  for(i=0;i<n;i++)
    scanf("%d",&x[i]);
  for(i=1;i<=n-1;i++)
    for(j=i;j<n-i;j++)
      if(x[j]>x[j+1]){
        t=x[j];
        x[j+1]=x[j];
        x[j]=t;
      }
  printf("排序结果:\n");
  for(i=0;i<n;i++){
    printf("%d\n",x[i]);
    if(i!=n-1)
      printf(" ");
}
  return 0;
}


第四个问题:

选择排序和冒泡排序的不同之处在于,选择排序是一趟一趟的选择最小的数或最大的数排,也就是说,首先从所有数中选出最小或最大的数和第一个位置上的数交换,这样第一趟就结束了,第二趟就是从剩下的数中选出最大或最小的和第二位比较,交换,依次类推.以下是代码:

test4.cpp

#include<stdio.h>
int main(){
  int x[100];
  int i,j,t,n,min;
  printf("请输入n:");
  scanf("%d",&n);
  printf("请输入n个数:\n");
  for(i=0;i<n;i++)
    scanf("%d",&x[i]);
  for(i=0;i<n-1;i++){
    min=i;
    for(j=i+1;j<n;j++)
      if(x[min]>x[j])
        min=j;
    if(i!=min){
      t=x[i];
      x[i]=x[min];
      x[min]=t;
    }
}
  for(i=0;i<n;i++){
    printf("%d",x[i]);
  if(i != n-1)
   printf(" ");
  }
  return 0;
}

第五个问题:

插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中.代码如下:

test5.cpp

#include<stdio.h>
#define M 10
void Insert(int a[])
{
  int i;
  for(i=0;i<M;i++)
    scanf("%d",&a[i]);
}
void Sort(int a[]){
  int i,j,x;
  for(i=0;i<M;i++){
    x=a[i];
    j=i-1;
    while(j>=0 && x<a[j]){
      a[j+1]=a[j];
      j--;
    }
    a[j+1]=x;
  }
  for(i=0;i<M;i++){
    printf("%d",a[i]);
    if(i != M-1)
      printf(" ");
}
}
int main()
{
  int a[M];
  Insert(a);
  Sort(a);
  return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值