数组最好用宏定义
一维数组在内存中占用字节的长度=数组长度 * sizeof(基类型)
高效的数组初始化方法:
#include<string.h>
memset(a, 0, sizeof(a));
高效的数组赋值:
#include<string.h>
memcpy(b, a, sizeof(a));
memcpy(b, a, sizeof(a));
使用这条语句时,如果数组a和b的长度不一样,
a比b长,溢出元素数据会丢失。
b比a长,不够的部分仍会显示原数据
简单参数传递给函数call by value
数组传递给函数call by reference
#include <stdio.h>
void Input(int x[], int n);
int Total(int x[], int n);
int FindMaxValue(int x[], int n);
int FindMinValue(int x[], int n);
int main()
{
int maxValue, minValue, Score[10], sum;
Input(Score, 10);
maxValue = FindMaxValue(Score, 10);
minValue = FindMinValue(Score, 10);
sum = Total(Score, 10);
printf("%d\n",(sum - maxValue - minValue) / 8);
return 0;
}
void Input(int x[], int n)
{
int i;
for(i = 0; i < n; i++)
{
scanf("%d", &x[i]);
}
}
int FindMaxValue(int x[], int n)
{
int i, maxValue = x[0];
for(i = 1; i < n; i++)
{
if(maxValue < x[i])
{
maxValue = x[i];
}
}
return maxValue;
}
int FindMinValue(int x[], int n)
{
int i, minValue = x[0];
for(i = 1; i < n; i++)
{
if(minValue > x[i])
{
minValue = x[i];
}
}
return minValue;
}
int Total(int x[], int n)
{
int i, sum = 0;
for(i= 0; i < n; i++)
{
sum += x[i];
}
return sum;
}
线性查找,二分法查找
#include<stdio.h>
int LinSearch(int num[], int x, int n);//线性查找
int Binsearch(int num[], int x, int n);//二分查找(分治思想),要求查找表有序
int main()
{
return 0;
}
int LinSearch(int num[], int x, int n)
{
int i = 0;
for(i = 0; i < n; i++)
{
if(x == num[i])
{
return i;
}
}
return -1;
}
int Binsearch(int num[], int x, int n)
{
int low = 0, high = n - 1, mid;
while (low < high)
{
//mid = (low + high) / 2;
mid = low + (high - low) / 2;//防止数值溢出
if (x < num[mid])
{
high = mid - 1;
}
else if (x > mum[mid])
{
low = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
交换排序
#include <stdio.h>
void ChangeSort(int x[], int n);
int main()
{
int x[4] = {4, 2, 5, 6};
ChangeSort(x, 4);
return 0;
}
void ChangeSort(int x[], int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n - 1; j++)
{
if (x[i] > x[j])
{
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
}
选择法排序
#include <stdio.h>
void SelectionSort(int x[], int n);
int main()
{
int x[] = {61, 83, 88, 87, 84};
SelectionSort(x, 5);
return 0;
}
void SelectionSort(int x[], int n)
{
int i, j, k, temp;
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n - 1; j++)
{
if (x[k] > x[j])
{
k = j;
}
}
if (k != i)
{
temp = x[i];
x[i] = x[k];
x[k] = temp;
}
}
}
冒泡法排序
#include <stdio.h>
void BubbleSort(int x[], int n);
int main()
{
int x[] = {61, 83, 88, 87, 84};
BubbleSort(x, 5);
return 0;
}
void BubbleSort(int x[], int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++)
{
for (j = 1; j < n - i; j++)
{
if (x[j] < x[j - 1])
{
temp = x[j];
x[j] = x[j - 1];
x[j - 1] = temp;
}
}
}
}
筛法求素数
//筛法求素数
#include<stdio.h>
#include <math.h>
#define N 100
void ShiftPrime(int a[], int n);
void PrintPrime(int a[], int n);
int main()
{
int a[N + 1];
ShiftPrime(a, N);
PrintPrime(a, N);
return 0;
}
void ShiftPrime(int a[], int n)
{
int i, j;
for (i = 2; i <= n; i++)
{
a[i] = i;
}
for (i = 2; i <= sqrt(n); i++)
{
for (j = i + 1; j <= n; j++)
{
if (a[i] != 0 && a[j] != 0 && a[j] % a[i] == 0)
{
a[j] = 0;
}
}
}
}
void PrintPrime(int a[], int n)
{
int i;
for (i = 2; i <= n; i++)
{
if (a[i] != 0)
{
printf("%d\t", a[i]);
}
}
printf("\n");
}
鲁智深吃馒头(约瑟夫环)
据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头,智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说,从我开始报数(围成一圈),第5个人可以吃到馒头(并退下),按照这个公平的方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上。请问他在哪个位置?
#include<stdio.h>
#define N 100
int main()
{
int a[100 + 1];
int b = 0;//the number of steamed bread
int num = 1;//现在报的数
int i;
for (i = 1; i <= N; i++)
{
a[i] = i;
}
while (b < 99)
{
for (i = 1; i <=N; i++)
{
if(a[i] != 0)//如果这个人没有吃馒头
{
if (num % 5 == 0)//报的数为5
{
b++;//馒头数加一
a[i] =0;//此人吃馒头
printf("%d号吃第%d个馒头\n",i,b);
}
num++;
}
}
}
for( i=1; i<N; i++ )
{
if(a[i]!=0)
{
printf("\n\n鲁智深是第%d个人\n",i);
}
}
return 0;
}
文曲星猜数
XAXB
A前表示数和位置皆对
B前表示数对,位置不对
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
void MakeDigit(int a[]);
int InputGuess(int b[]);
int IsRightPosition(int magic[], int guess[]);
int IsRightDigit(int magic[], int guess[]);
int main()
{
int a[10], b[4];
int lever;
int count;
int rightPosition, rightDigit;
MakeDigit(a);
printf("How many times do you want to guess\n");
scanf("%d", &lever);
count = 0;
do
{
printf("NO. %d of %d times \n", count, lever);
printf("Input your guess:\n");
if (InputGuess(b) == 0)continue;
count++;
rightPosition = IsRightPosition(a, b);
rightDigit = IsRightDigit(a, b) - rightPosition;
printf("%dA%dB\n", rightPosition, rightDigit);
}while (rightPosition != 4 && count < lever);
if(rightPosition == 4)
{
printf("Congratulation your guess the right number at NO.%d\n", count);
}
else
{
printf("Sorry you haven't guess the right number, see you next time");
}
printf("Correct answer is : %d %d %d %d",a[0], a[1], a[2], a[3]);
return 0;
}
//void MakeDigit(int a[])
//{
// srand(time(NULL));
// a[0] = rand() % 10;
// do
// {
// a[1] = rand() % 10;
// } while (a[0] == a[1]);
// do
// {
// a[2] = rand() % 10;
// } while (a[2] ==a[0] || a[2] == a[1]);
// do
// {
// a[3] = rand() % 10;
// } while (a[3] ==a[0] || a[3] == a[1] || a[3] == a[2]);
//}
void MakeDigit(int a[])
{
int i, j ,temp;
//srand(time(NULL));
for (i = 0; i < 10; i++)
{
a[i] = i;
}
for (i = 0; i < 10; i++)
{
j = rand() % 10;
temp = a[j];
a[j] = a[i];
a[i] =temp;
}
}
int InputGuess(int b[])
{
int i,ret;
for (i = 0; i < 4; i++)
{
ret = scanf("%1d", &b[i]);
if (ret != 1)
{
printf("Input data type error \n");
fflush(stdin);
return 0;
}
}
if (b[0] == b[1] || b[0] == b[2] || b[0] == b[3] || b[1] == b[2] || b[1] == b[3] || b[2] == b[3])
{
printf("The number must be different from each other, please input again\n");
return 0;
}
else
return 1;
}
int IsRightPosition(int magic[], int guess[])
{
int rightPosition = 0;
int j;
for (j = 0; j < 4; j++)
{
if (guess[j] == magic[j])
{
rightPosition++;
}
}
return rightPosition;
}
int IsRightDigit(int magic[], int guess[])
{
int rightDigit;
int j, k;
for (j = 0; j < 4; j++)
{
for (k = 0; k < 4; k++)
{
if (magic[j] == guess[k])
{
rightDigit++;
}
}
}
return rightDigit;
}