第八周

来源:互联网 发布:耐玩的网络游戏知乎 编辑:程序博客网 时间:2024/05/22 14:15

数组最好用宏定义
一维数组在内存中占用字节的长度=数组长度 * 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 100void 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 100int 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;}

大数存储

0 1
原创粉丝点击