大计基编程(第十四周)

排序算法

如果不太了解各种排序算法可以参考菜鸟教程(希望对你有帮助)

菜鸟教程排序算法

题目一

题目描述

有一个包含奇数个项的整数序列,请编程按照以下规则排序:最大值排在中间,最小值排在最左,中值排在最右,其它值清为0。输入2行,第一行n表示要输入的数的个数,n是奇数。第二行输入的n个数。输出,排序后的数组,数据空格分隔,最后一个数据后面没有空格。

输入样例:
5
12 20 9 88 32
输出样例:
9 0 88 0 20

题解

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

/*冒泡排序法*/
void booble(int* array, int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (array[j]>array[j+1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
    int t = (n - 1) / 2;//t即为中间是的数的序号
    /*交换中间的数和最大的数的位置*/
    int temp = array[t];
    array[t] = array[n-1];
    array[n - 1] = temp;
  /*除中间数和最大最小数全都赋值为0*/
    for (size_t i = 1; i < n-1; i++)
    {
        if (i!=t)
        {
            array[i] = 0;
        }
     }
}
int main() {
    int n;
    scanf("%d", &n);
    int *description = (int*)malloc(n * sizeof(int));
    for (size_t i = 0; i < n; i++)
    {
        scanf("%d", (description+i));
    }
    booble(description, n);
    for (size_t i = 0; i < n-1; i++)
    {
        printf("%d ", *(description + i));
    }
    printf("%d", *(description+n-1));
}

题目二

题目描述

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
输入格式: 输入表示若干种石子的初始情况,包含两个非负整数 a 和 b ,表示两堆石子的数目, a 和 b 都不大于1,000,000,000 。
输出格式: 包含一个数字 1 或 0 ,如果最后你是胜者,则为 1 ,反之,则为 0 。
输入样例:
2 1
输出样例:
0

题解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	//	freopen("in.txt","r",stdin);
	int a, b, k, ta;
	scanf("%d%d", &a, &b);
	if (a > b) { int t = a; a = b, b = t; }
	k = b - a;
	ta = (int)floor(k * ((sqrt(5.0) + 1) / 2));
	printf("%d", ta == a ? 0 : 1);
	return 0;
}

题目三

题目描述

题目描述:
输入公元年份和月份,输出该月份的天数。

输入输出格式:

输入: 年,月(逗号分隔)

输出: 天数

题解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	int year, mon, day;
	scanf("%d,%d", &year, &mon);
		if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12)
		{
			day = 31;
		}
		else if (mon == 2) { 
			if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) day = 29;
			else day = 28;

		}
		else day = 30;
		printf("%d", day);
	return 0;
}

题目四

题目描述

题目描述:
输入两个正整数,输出其中最大公约数和最小公倍数。
输入输出格式:
输入: 从键盘输入两个正整数
输出: 最大公约数和最小公倍数。

样例:
输入:

15,25
输出:
最大公约数是5

最小公倍数是75

1. 求p和q的最大公约数的欧几里德算法:
(1)输入p和q(p>q)
(2)计算p和q的余数r
(3)r=0时,q即为最大公约数,转第(4)步
否则,令p=q,q=r,继续执行第(2)步
(4)输出q

2. p和q的最小公倍数为p乘以q再除以它们的最大公约数。

题解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
void swap(int*a, int*b) {
	int temp = a;
	a = b;
	b = temp;
}
int main()
{
	int num1,num2;
	scanf("%d,%d", &num1, &num2);
	int multiple = num1 * num2;
	if (num1<num2)
	{
		swap(&num1, &num2);
	}
	while (num1 % num2 !=0)
	{
		int r = num1 % num2;
		num1 = num2;
		num2 = r;
	}
	printf("最大公约数是%d\n最小公倍数是%d\n", num2, multiple / num2);
	return 0;
}

题目五

题目描述

题目描述:

查找一个字符在字符串中的第一个位置并输出这个位置。

输入输出格式:

输入:待查找的字符串和需要查找的字符。(输入时,待查找的字符串与所需查找的字符用*号隔开)

输出:字符的位置(如有多个相同的字符,只查找第一个。)

样例:
输入:

I am a student*m

输出:

4

题解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char num1[200];
	char num2;
	gets(num1);
	num2 = num1[strlen(num1) - 1];
	for (size_t i = 0; i < strlen(num1); i++)
	{
		if (num1[i]==num2)
		{
			printf("%d", i+1);
			return 0;
		}
	}
}

题目六

题目描述

题目描述:

输入两个整型数组(假设数组的大小为不超过10)的各个元素,输出不是两个数组共有的元素,并从小到大排序输出。

输入输出格式:

输入:两个数组的元素(小于10个),数组中第一个数据指示元素的个数

输出:两个数组的元素中非共有的元素,并且从小到大进行排序

样例

输入:

7 1 2 3 4 5 6 7

6 5 6 7 8 9 0

输出:

0 1 2 3 4 8 9

题解

#include<stdio.h>
void bubblesort(int a[], int n);//函数原型
int main()
{
       int a[10]; int b[10]; int c[20],d[20];
       int n,k=0,i,j;
       scanf("%d", &a[0]);
       for (i = 1; i <=a[0]; i++)
              scanf(" %d", &a[i]);
       scanf("%d", &b[0]);
       for(i=1;i<=b[0];i++)
              scanf(" %d", &b[i]);//数组的输入
       for (i = 1; i <= a[0]; i++)
              c[i-1] = a[i];
       for (i =1; i <=b[0]; i++)
              c[i+a[0]-1] = b[i];//a、b两个数组合为一个数组c,可能是这一步的多余导致过程繁杂
       for (i = 0; i < a[0] + b[0]; i++)//往下判断数组元素是否重复,并且将不重复项赋给数组d
       {
              int w = 0;//易漏
              for (j = 0;j< a[0] + b[0]; j++)
              {
                      if (c[i] == c[j])
                             w++;//巧妙的判断
              }
              if (w==1)//等号别漏
              {
                      d[k] = c[i]; k++;//直接赋值,不用for循环,利用前面的for循环的余温
              }
       }
       bubblesort(d, k);//函数引用
       printf("%d", d[0]);
       for(i=1;i<k;i++)
              printf(" %d", d[i]);
       //不合法语句//system ("pause");
       return 0;
}
void bubblesort(int a[], int n)//定义冒泡排序函数,含指针
{
       int i, j, h;
       for (i = 0; i < n - 1; i++)//使下面的梳理顺序再次执行(最多只需执行n-1次,例如43210,经过5-1=4次梳理,可得01234)
       {
              for (j = 0; j < n - i - 1; j++)//单次梳理顺序,顺序排列(例如43210,经过1次梳理,可得32104)
              {
                      if (a[j] > a[j + 1])//数值交换
                      {
                             h = a[j + 1]; a[j + 1] = a[j]; a[j] = h;
                      }
              }
       }
}

题目七

题目描述

定义一个含20个元素的整型数组并初始化为a[20]={1,2,3,4,5,6,7,8,9,10}。另外定义一个大小为10的整型数组b。

要求:输入整数n(1<=n<=10),然后输入n个整数存入b中,再输入一个整数k(1<= k <=10),

将数组b中的n个元素依次插入到数组a中从第k位开始的地方,插入完成后,输出数组a(元素间用空格隔开)。

输入输出格式:

输入:整数n,n个整数,整数k

输出:数组a

样例:

2

11 22

1 2 11 22 3 4 5 6 7 8 9 10

题解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int n,m;
	scanf("%d", &n);
	int a[20], b[10];
	for (size_t i = 0; i < 10; i++)
	{
		a[i] = i + 1;
	}
	for (size_t j = 0; j < n; j++)
	{
		scanf("%d", &b[j]);
	}
	scanf("%d", &m);
	for (size_t i = 0 ; i < n; i++)
	{
		for ( int j=i+10; j >i+n;j--)
		{
			a[j] = a[j-1];
		}
		a[i + m] = b[i];
	}
	for (size_t i = 0; i < 10+n-1; i++)
	{
		printf("%d ", a[i]);
	}
	printf("%d", a[10 + n-1]);
}

题目八

题目描述

A reversible prime in any number system is a prime whose “reverse” in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.

Now given any two positive integers N (< 105) and D (1 < D <= 10), you are supposed to tell if N is a reversible prime with radix D.

Input Specification:

The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.

Output Specification:

For each test case, print in one line “Yes” if N is a reversible prime with radix D, or “No” if not.

题解

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int iPrime(int N)
{
    if (N == 0 || N == 1)
        return 0;
    for (int i = 2; i * i <= N; i++)
        if (N % i == 0)
            return 0;
    return 1;
}
int Rev(int N, int D)
{
    int Nrev;
    for (Nrev = 0; N; N /= D)
    {
        Nrev *= D;
        Nrev += N % D;
    }
    return Nrev;
}
int main()
{
    int N, D,i=0;
    int a[100];
    while (1) {
        scanf("%d", &N);
        if (N<=0)
        {
            break;
        }
        scanf("%d", &D);
        if (iPrime(N) && iPrime(Rev(N, D))) a[i] = 1;
        else a[i] = 0;
        i++;
    }
    for (size_t j = 0; j < i; j++)
    {
        if (a[j]) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值