1. 输出和为一个给定整数的所有组合
   例如n=5
   5=1+4;5=2+3(相加的数不能重复)
   则输出
   1,4;2,3。

#include<stdio.h>
const int MAX = 10;
int g[MAX],N,M;
int sum = 0;//和 
void fun(int n,int m,int sumN)
{
	for(int i=n;i>=1;i--)
	{
		g[m] = i;
		if(m>1)
		{
			fun(i-1,m-1,sumN);
		}
		else
		{
			for(int j=1;j<=M;j++)
			{
				sum+=g[j]; 
			}
			
			if(sum == sumN)
			{
				printf("%d=",sum);
				for(int j=1;j<=M;j++)
				{
					if(j<M)
					{
						printf("%d+",g[j]);
					}
					else
					{
						printf("%d",g[j]);
					}
				}
				sum = 0;
				printf("\n");
			}
			else
			{
				sum = 0;
			}
		}
	}
} 

int main()
{
	printf("请输入和:");
	scanf("%d",&N);
	for(M=2;M<N;M++)
	{
		fun(N,M,N);	
	}
	
	/*int i;
	scanf("%d",&i);*/
	return 0;
}



2013-8-6学习练习_i++

 


2.  写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二   大、  第三大的数都是4,位置在1、3随便输出哪一个均可。函数接口为:

int find_orderk(const int* narry,const int n,const int k)  
#include <stdio.h>
int fine_orderk(const int *narry,const int n,const int k)
{
    int j=0; //记录第几大的那个位置
    int number = 0; //记录第几大的那个数
    int sortedArray[8];
    //数组赋值
    for (int i=0; i<8; i++) {
        sortedArray[i] = narry[i];
    }
    //新数组排序
    for (int i=0; i<8; i++) {
        for (int j=0; j<8-i-1; j++) {
            if (sortedArray[j]<sortedArray[j+1]) {
		//为什么这样不行
                //sortedArray[j]^=sortedArray[j+1]^=sortedArray[j];
                sortedArray[j] = sortedArray[j] ^ sortedArray[j+1];
                sortedArray[j+1] = sortedArray[j] ^ sortedArray[j+1];
                sortedArray[j] = sortedArray[j] ^ sortedArray[j+1];
            }
        }
    }
    for (int i=0; i<8; i++) {
        if (narry[i] == sortedArray[n-1]) {
            j = i;
            number = narry[i];
            break;
        }
    }
    printf("第%d大的数是%d,它在位置%d",n,number,++j);
    return 0;
}
int main(int argc, const char * argv[])
{
    printf("请输入8个数:");
    int n=8;
    int array[8];
    for (int i=0; i<8; i++) {
        scanf("%d",&array[i]);
    }
    printf("您输入的数组是:");
    for (int i=0; i<8; i++) {
        printf("%d ",array[i]);
    }
    int nn,kk=0;
    while (1) {
        printf("\n请输入第几大的数n(1<=n<=8):");
        scanf("%d",&nn);
        if (nn>=1&&nn<=8) {
            kk = fine_orderk(array, nn, kk);
        }
        else
            printf("请输入1-8之间的数!");
    }
    return 0;
}



请输入8个数:5 4 3 2 1 6 7 8

您输入的数组是:5 4 3 2 1 6 7 8 

请输入第几大的数n(1<=n<=8):8

第8大的数是1,它在位置5

请输入第几大的数n(1<=n<=8):1

第1大的数是8,它在位置8

请输入第几大的数n(1<=n<=8):5

第5大的数是4,它在位置2

 

3.用递归算法判断数组a[N]是否为一个递增数组。

#include <stdio.h>
int jargeArray(int p[8],int n)
{
    if (n>0) {
            if (p[n]<p[n-1]) {
            return 0;
        }
        jargeArray(p, --n);
        return 1;
    }
    else
        return 1;
}
int main(int argc, const char * argv[])
{
    int array[8];
    printf("请输入8个整数:");
    for (int i= 0; i<8; i++) {
        scanf("%d",&array[i]);
    }
    int f = jargeArray(array,7);
    if (0==f) {
        printf("不是递增数组");
    }
    else
    {
        printf("是递增数组");
    }
    return 0;
}


请输入8个整数:2 3 4 5 6 7 8 9

该数组是递增数组

请输入8个整数:1 2 4 3 6 5 8 7

该数组不是递增数组


4.用指针的方法,将字符串“ABCD1234efgh”前后对调显示

#include <stdio.h>
int main(int argc, const char * argv[])
{
    char *p = "ABCD1234efgh";
    int i = strlen(p);
    char c[30]={'\0'};
    for (int j=0; j<i; j++) {
        c[j] = *p++;
    }
    for (int j = 0; j<=i/2; j++) {
        c[j] = c[j]^c[i-j-1];
        c[i-j-1] = c[j]^c[i-j-1];
        c[j] = c[j]^c[i-j-1];
    }
    //输出打印
    printf("%s",c);
    return 0;
}
 
 hgfe4231DCBA


5.输入N, 打印 N*N 矩阵

比如 N = 3,打印:


1  2  3

8  9  4

7  6  5


N = 4,打印:


1   2   3   4

12  13  14  5

11  16  15  6

10  9   8   7 


//蛇形函数问题
#include<stdio.h>
#include<string.h>
void main()
{
    int i = 0,n,k = 1;
    printf("请输入N:");
    scanf("%d",&n);  //
    //int j = n-1,
    int s[100][100];
    int m = 0;
    memset(s,0,sizeof(s));  //内存初始化
    
    while(k<=n*n)
    {
        //从s[0][n-1]开始
//        while(i<=n-1&&s[i][j]==0&&k<=n*n) {s[i++][j] = k++;}
//        i--;//不然的话上面一行i++之后越过边界了
//        j--;//不然会覆盖边角的那个数
//        while(j>=0&&s[i][j]==0&&k<=n*n)  {s[i][j--] = k++;}
//        j++;
//        i--;
//        while(i>=0&&s[i][j]==0&&k<=n*n)  {s[i--][j] = k++;}
//        i++;
//        j++;
//        while(j<=n-1&&s[i][j]==0&&k<=n*n)  {s[i][j++] = k++;}
//        i++;
//        j--;
        //从s[0][0]开始
        while(m<=n-1&&s[i][m]==0&&k<=n*n) {s[i][m++] = k++;}
        i++;
        m--;
        while(i<=n-1&&s[i][m]==0&&k<=n*n)  {s[i++][m] = k++;}
        m--;
        i--;
        while(m>=0&&s[i][m]==0&&k<=n*n)  {s[i][m--] = k++;}
        i--;
        m++;
        while(i>=0&&s[i][m]==0&&k<=n*n)  {s[i--][m] = k++;}
        i++;
        m++;
    }
    
    //打印输出
    for(int x = 0;x<n;x++)
    {
        for(int y = 0;y<n;y++)
        {
            if(s[x][y]<10)
                printf("%d  ",s[x][y]);
            else
                printf("%d ",s[x][y]);
        }
        printf("\n");
    }
}

结果: