例如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; }
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");
}
}
结果: