Day1

1.       打印九九乘法表

#include <stdio.h>
#include <stdio.h>

void multiply(int n)
{
    int i, j;
    for (i = 1; i <= n; i++)
    {
        for (j = 1;j <= i;j++)
            printf("%2d*%2d=%2d ", i, j, i*j);
        printf("\n");
    }
}

int main()
{
    int n;
    printf("请输入行数:");
    scanf("%d", &n);
    multiply(n);
    system("pause");
    return 0;
}

2.       打印如下图形:

(1)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int head, current;
    int row;
    for (row = 1; row <= 5; row++)
    {
        for (head = 5 - row; head > 0; head--)
            printf(" ");
        for (current = 1; current <= row; current++)
            printf("* ");
        printf("\n");
    }
    for (row = 4; row > 0; row--)
    {
        for (head = 5 - row; head > 0; head--)
            printf(" ");
        for (current = 1; current <= row; current++)
            printf("* ");
        printf("\n");
    }
    system("pause");
    return 0;
}

(2)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int row;
    int head, mid;
    printf("    *    \n");  //可以放到循环中吗?
    for (row = 2; row <= 5; row++)
    {
        for (head = 5 - row; head > 0; head--)
            printf(" ");
        printf("*");
        for (mid = 0; mid < 2 * row - 3; mid++)
            printf(" ");
        printf("*\n");
    }
    for (row = 4; row > 1; row--)
    {
        for (head = 5 - row; head > 0; head--)
            printf(" ");
        printf("*");
        for (mid = 0; mid < 2 * row - 3; mid++)
            printf(" ");
        printf("*\n");
    }
    printf("    *    \n");
    system("pause");
    return 0;
}

(3)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int head, current, mid;
    int row;
    for (row = 1; row <= 3; row++)
    {
        for (head = 4 - row; head > 0; head--)
            printf(" ");
        for (current = 1; current <= row + 1; current++)
            printf("* ");
        for (mid = 1; mid <= 9 - 2 * row; mid++)
            printf(" ");
        for (current = 1; current <= row + 1; current++)
            printf("* ");
        printf("\n");
    }
    for (row = 0; row < 10; row++)
    {
        for (head = 1; head <= row; head++)
            printf(" ");
        for (current = 1; current <= 10 - row; current++)
            printf("* ");
        printf("\n");
    }
    system("pause");
    return 0;
}

4.(1)求两个有序数组的公共元素

#include <stdio.h>
#include <stdlib.h>
#define M 5
#define N 7

void intersection(int array1[], int array2[])
{
    int i = 0, j = 0;
    while (i < M && j < N)
    {
        while (array1[i] < array2[j])
            i++;
        while (array1[i] > array2[j])
            j++;
        while (array1[i] == array2[j])
        {
            printf("%d ", array1[i]);
            i++;
            j++;
        }
    }
}

int main()
{
    int array1[M] = { 1,3,4,7,8 };
    int array2[N] = { 2,3,5,6,7,8,11 };
    intersection(array1, array2);
    system("pause");
    return 0;
}

(2) 求三个有序数组的公共元素。

#include <stdio.h>
#include <stdlib.h>
#define N 7

void intersection(int array1[], int array2[], int b1[])
{
    int i = 0, j = 0, k = 0;
    while (i < N && j < N)  //array1[1] && array2[j]
    {
        while (array1[i] < array2[j] && i < N)
            i++;
        while (array1[i] > array2[j] && j < N)
            j++;
        while (array1[i] == array2[2] && i < N && j < N)
        {
            b1[k++] = array1[i];
            i++;
            j++;
        }
    }
}

int main()
{
    int i;
    int array1[N] = { 1,3,4,7,8,9,10 };
    int array2[N] = { 2,3,5,6,7,8,11 };
    int array3[N] = { 1,2,3,4,5,6,7 };
    int b1[N] = { 0 }, b2[N] = { 0 };
    intersection(array1, array2, b1);
    intersection(array3, b1, b2);
    for (i = 0; b2[i]; i++)
        printf("%d ", b2[i]);
    system("pause");
    return 0;
}

(3)求n个有序数组的公共元素。

#include <stdio.h>
#include <stdlib.h>
#define M 5
#define N 7

void intersection(int array1[], int array2[], int b1[])
{
    int i = 0, j = 0, k = 0;
    while (i < N && j < N)
    {
        while (array1[i] < array2[j] && i < N)
            i++;
        while (array1[i] > array2[j] && j < N)
            j++;
        while (array1[i] == array2[j] && i < N&&j < N)
        {
            b1[k++] = array1[i];
            i++;
            j++;
        }
    }
}

int main()
{
    int i;
    int array1[M][N] = { {1,3,4,7,8,9,10},{2,3,5,6,7,8,11},{1,2,3,4,5,6,7},{1,3,4,6,7,9,10},{2,5,6,7,8,15,17} };
    int b[M - 1][N] = { {0},{0},{0},{0} };
    intersection(array1[0], array1[1], b[0]);
    for (i = 2; i < M; i++)
        intersection(array1[i], b[i - 2], b[i - 1]);
    for (i = 0; b[M - 2][i]; i++)
        printf("%d\n", b[M - 2][i]);
    system("pause");
    return 0;
}

5.求数组的最大值和次大值。

#include<iostream>
#include<vector>
using namespace std;

int max(int a, int b)
{
    return a > b ? a : b;
}

int min(int a, int b)
{
    return a < b ? a : b;
}

void maxAndSec(vector<int> &nums, int left, int right, int &Max, int &secMax)
{
    if (left == right)
    {
        Max = nums[left];
        secMax = INT_MIN;
        return;
    }
    if (left == right - 1)
    {
        secMax = min(nums[right], nums[left]);
        Max = max(nums[right], nums[left]);
        return;
    }
    int mid = (left + right) / 2;
    int leftMax = 0, leftSec = 0;
    maxAndSec(nums, left, mid, leftMax, leftSec);
    int rightMax = 0, rightSec = 0;
    maxAndSec(nums, mid + 1, right, rightMax, rightSec);
    Max = max(leftMax, rightMax);
    if (leftMax < rightMax)
        secMax = max(leftMax, rightSec);
    else
        secMax = max(rightMax, leftSec);
}

void maxAndSec2(int *nums, int len)
{
    if (len == 0)
        return;
    int Max = nums[0];
    int secMax = INT_MIN;
    for (int i = 1; i < len; i++)
    {
        if (nums[i] > Max)
        {
            secMax = Max;
            Max = nums[i];
        }
        else
        {
            if (nums[i] > secMax)
            {
                secMax = nums[i];
            }
        }
    }
    cout << Max << endl << secMax << endl;
}
int main()
{
    int num[7] = { 2,4,100,5,6,7,3 };
    maxAndSec2(num, 6);
    vector<int> nums(num, num + 7);
    int max = 0, secmax = 0;
    maxAndSec(nums, 0, 6, max, secmax);
    cout << "最大值是:" << max << endl << "次大值是:" << secmax << endl;
}

6. 给定一个n个整型元素的数组a,其中有一个元素出现次数超过n / 2,求这个元素。

#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000

int a[MAXN], b[MAXN];


bool IsMainCell(int *a, int n, int probable) {
    int cnt = 0;
    for (int i = 0; i < n; i++)
        if (a[i] == probable)
            cnt++;
    if (cnt > n / 2)
        return true;
    else
        return false;
}

int FindMainCell(int a[], int b[], int n, int n2) {
    if (n == 0)
        return -1;
    if (n == 1)
        if (IsMainCell(b, n2, a[0]))
            return a[0];
        else
            return -1;
    int cnt = 0;
    for (int i = 0; i + 1 < n; i++) {
        if (a[i] == a[i + 1]) {
            b[cnt++] = a[i];
        }
    }
    int res = FindMainCell(b, a, cnt, n);
    if (res == -1 && n % 2 == 1 && IsMainCell(a, n, a[n - 1]))
        return a[n - 1];
    else
        return res;
}

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);


    int temp = FindMainCell(a, b, n, 0);
    if (temp == -1)
        printf("no");
    else
        printf("%d", temp);
}

7.给定一个含有n个元素的整型数组,找出数组中的两个元素x和y使得abs(x - y)值最小

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 10

void min_abs(int array[], int *x, int *y)
{
    int min = abs(array[1] - array[0]);
    int i, j;
    for(i=0; i<N-1; j++)
        for(j=i+1; j<N; j++)
            if (min > abs(array[i] - array[j]))
            {
                min = abs(array[i] - array[j]);
                *x = i;
                *y = j;
            }
}

int main()
{
    int array[N];
    int i;
    int x, y;
    for (i = 0; i < N; i++)
        scanf("%d", &array[i]);
    min_abs(array, &x, &y);
    printf("%d %d\n", array[x], array[y]);
    system("pause");
    return 0;
}

8. 给定含有1001个元素的数组,其中存放了1-1000之内的整数,只有一个整数是重复的,请找出这个数

A1 + … + A1001 – (1 + …+ 1000)

#include <stdio.h>
#include <stdlib.h>

int repeat_num(int array[])
{
    int i;
    long sum = 0;
    for (i = 0; i <= 1000; i++)
        sum = sum + array[i] - i;
    return sum;
}

int main()
{
    int array[1001];
    int num;
    int i;
    for (i = 0; i < 500; i++)
        array[i] = i + 1;
    array[i++] = 500;
    for (; i < 1001; i++)
        array[i] = i;
    num = repeat_num(array);
    printf("%d\n", num);
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值