第八周

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

大数存储

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值