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;
}