题目:

/*折半查找*/

1

输出以下杨辉三角

#include<stdio.h>

1 1

1

#define MAX 100

1 2 1

1 1

int a[MAX];

1 3 3 1

1 2 1

void init_array(int n)//初始化数组

1 4 6 4 1

1 3 3 1

{

的三角形,其实质是二项式的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。这个题目常用于程序设计的练习。

1 4 6 4 1

int i;

下面给出六种不同的解法。

··········

for(i=0;i<n;i++)

解法一

要求输出10行

{

#include <stdio.h>

 

printf(“a[%d]=”,i);

main()

有好多错误,请好心的高手指点指点~~非常感谢

scanf(“%d”,&a[i]);

{ int i,j,n=0,a[17][17]={0};

#include<stdio.h>
int main()
{
    int a[10][10];
    int i,j;
    a[0][0]=1;
    printf(“%d”,a[0][0]);
    printf(“n”);
    a[1][0]=1;a[1][1]=1;
    printf(“%d%2d”,a[1][0],a[1][1]);
    printf(“n”);
    for(i=2;i<10;i++)
    {
        for(j=0;j<i;j++)
        {
            if(j=0)
            {a[i][j]=1;
                           printf(“%d”,a[i][j]);
                          }
                                else
            a[i][j]=a[i-1][j-1]+a[i-1][j];
                         printf(“%d”,a[i][j]);
      
        }
    
      printf(“%d”,a[i][j]);
      
          
          printf(“n”);
    }
    

}

while(n<1 || n>16)

    return 0;
}

}

{ printf(“请输入杨辉三角形的行数:”);

void print_array(int n)//输出数组

scanf(“%d”,&n);

{

}

int i;

for(i=0;i<n;i++)

for(i=0;i<n;i++)

a[i][0]=1; /*第一列全置为一*/

printf(“a[%d]=%-3d”,i,a[i]);

for(i=1;i<n;i++)

printf(“n”);

for(j=1;j<=i;j++)

}

a[i][j]=a[i-1][j-1]+a[i-1][j];/*每个数是上面两数之和*/

int halfserch(int n,int key)

for(i=0;i<n;i++) /*输出杨辉三角*/

{

{ for(j=0;j<=i;j++)

int s,e,i;

printf(“%5d”,a[i][j]);

s=1;

printf;

e=n;

}

while(s<=e)

}

{

点评:解法一是一般最容易想到的解法,各部分功能独立,程序浅显易懂。

i=(s+e)/2;

解法二

if(key<a[i])

#include <stdio.h>

e=i-1;

main()

else if(key>a[i])

{ int i,j,n=0,a[17][17]={1};

s=i+1;

while(n<1 || n>16)

else//刚好找到,返回

{ printf(“请输入杨辉三角形的行数:”);

return(i);

scanf(“%d”,&n);

}

}

return (0);

for(i=1;i<n;i++)

}

{ a[i][0]=1; /*第一列全置为一*/

bublesort(int n)

for(j=1;j<=i;j++)

{

a[i][j]=a[i-1][j-1]+a[i-1][j]; /*每个数是上面两数之和*/

int i,j,tmp;

}

for(i=0;i<n;i++)

for(i=0;i<n;i++) /*输出杨辉三角*/

for(j=0;j<i;j++)

{ for(j=0;j<=i;j++)

if(a[i]<a[j])

printf(“%5d”,a[i][j]);

{

printf;

tmp=a[i];

}

a[i]=a[j];

}

a[j]=tmp;

点评:解法二是在解法一的基础上,把第一列置为1的命令移到下面的双重循环中,减少了一个循环。注意初始化数组的变化。

}

解法三

}

#include <stdio.h>

int main(void)

main()

{

{ int i,j,n=0,a[17][17]={0,1};

int n,key,flag;

while(n<1 || n>16)

printf(“Input the array size n:n”);

{ printf(“请输入杨辉三角形的行数:”);

scanf(“%d”,&n);

scanf(“%d”,&n);

init_array(n);

}

printf(“Input the key you want to findn”);

for(i=1;i<=n;i++)

scanf(“%d”,&key);

for(j=1;j<=i;j++)

bublesort(n);

a[i][j]=a[i-1][j-1]+a[i-1][j]; /*每个数是上面两数之和*/

print_array(n);

for(i=1;i<=n;i++) /*输出杨辉三角*/

flag=halfserch(n,key);

{ for(j=1;j<=i;j++) printf(“%5d”,a[i][j]);

if(flag)

printf;

printf(“We found it a[%d]=%dn”,flag,a[flag]);

}

else

}

printf(“Not Found the number %d!n”,key);

点评:解法三是在解法一、二的基础上,把第一列置为1的命令去掉了,注意初始化数组的变化。

}

解法四

/*快速排序*/

#include <stdio.h>

#include<stdio.h>

main()

#define MAX 100

{ int i,j,n=0,a[17][17]={0,1};

int a[MAX];

while(n<1 || n>16)

void init_array(int n)

{ printf(“请输入杨辉三角形的行数:”);

{

scanf(“%d”,&n);

int i;

}

for(i=0;i<n;i++)

for(i=1;i<=n;i++)

{

{ for(j=1;j<=i;j++)

printf(“a[%d]=”,i);

{ a[i][j]=a[i-1][j-1]+a[i-1][j]; /*每个数是上面两数之和*/

scanf(“%d”,&a[i]);

printf(“%5d”,a[i][j]); /*输出杨辉三角*/

}

}

}

printf;

void print_array(int n)

}

{

}

int i;

点评:解法四是在解法三的基础上,把计算和打印合并在一个双重循环中。

for(i=0;i<n;i++)

解法五

printf(“a[%d]=%-3d”,i,a[i]);

#include <stdio.h>

}

main()

void quicksort(int s,int e)

{ int i,j,n=0,a[17]={1},b[17];

{

while(n<1 || n>16)

int i,j,tmp,key;

{ printf(“请输入杨辉三角形的行数:”);

i=s;

scanf(“%d”,&n);

j=e;

}

key=a[s];

for(i=0;i<n;i++)

while(i<j)

{ b[0]=a[0];

{

for(j=1;j<=i;j++)

if(a[i]>a[j])

b[j]=a[j-1]+a[j]; /*每个数是上面两数之和*/

{

for(j=0;j<=i;j++)

tmp=a[i];

/*输出杨辉三角*/

a[i]=a[j];

{ a[j]=b[j]; /*把算得的新行赋给a,用于打印和下一次计算*/

a[j]=tmp;

printf(“%5d”,a[j]);

if(tmp==key)

}

i++;

printf;

else

}

j–;

}

}

点评:解法一到解法四都用了二维数组,占用的空间较多。而解法五只使用了两个一维数组。

else

解法六

{

#include <stdio.h>

if(a[i]==key)

main()

j–;

{ int i,j,n=0,a[17]={0,1},l,r;

else

while(n<1 || n>16)

i++;

{ printf(“请输入杨辉三角形的行数:”);

}

scanf(“%d”,&n);

}

}

if(s<i-1)

for(i=1;i<=n;i++)

quicksort(s,i-1);

{ l=0;

if(i+1<e)

for(j=1;j<=i;j++)

quicksort(i+1,e);

{ r=a[j];

}

a[j]=l+r; /*每个数是上面两数之和*/

int main(void)

l=r;

{

printf(“%5d”,a[j]); /*输出杨辉三角*/

int n;

}

printf(“Input the array size n:n”);

printf;

scanf(“%d”,&n);

}

init_array(n);

}

quicksort(0,n-1);

点评:解法六只使用了一个一维数组和两个临时变量。

print_array(n);

――C语言三人行+

printf(“n”);

}