大计基编程(第十四周)

   日期:2020-05-24     浏览:114    评论:0    
核心提示:排序算法如果不太了解各种排序算法可以参考菜鸟教程(希望对你有帮助)菜鸟教程排序算法题目排序算法题目一题目描述题解题目二题目描述题解题目三题目描述题解题目四题目描述题解题目五题目描述题解题目六题目描述题解题目七题目描述题解题目八题目描述题解题目一题目描述有一个包含奇数个项的整数序列,请编程按照以下规则排序:最大值排在中间,最小值排在最左,中值排在最右,其它值清为0。输入2行,第一行n表示要输入的数的个数,n是奇数。第二行输入的n个数。输出,排序后的数组,数据空格分隔,最后一个数据后面没有空格。输数据结构与算

排序算法

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

菜鸟教程排序算法

题目

    • 排序算法
  • 题目一
    • 题目描述
    • 题解
  • 题目二
    • 题目描述
    • 题解
  • 题目三
    • 题目描述
    • 题解
  • 题目四
    • 题目描述
    • 题解
  • 题目五
    • 题目描述
    • 题解
  • 题目六
    • 题目描述
    • 题解
  • 题目七
    • 题目描述
    • 题解
  • 题目八
    • 题目描述
    • 题解

题目一

题目描述

有一个包含奇数个项的整数序列,请编程按照以下规则排序:最大值排在中间,最小值排在最左,中值排在最右,其它值清为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;
  
    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;
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服