3.26 OJ

一、

五个一组求平均(填空)

作者: Turbo

时间限制: 1s

章节: 一维数组

问题描述

程序的功能是:按顺序给s数组中的元素赋予从2开始的偶数,然后再按顺序对每五个元素求一个平均值,并将这些值依次存放在w所指的数组中。若s数组中元素的个数不是5的倍数,多余部分忽略不计。

例如,s数组有14个元素,则只对前10个元素进行处理,不对最后的4个元素求平均值。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。

不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

#define SIZE 100

int main() {

double s[SIZE], w[SIZE / 5];

int i, k, n;

double sum;

scanf("%d", &n);

for (k = 2, i = 0; i < n; i++) {

s[i] = k;

/**********found**********/

1;

}

sum = 0.0;

for (k = 0, i = 0; i < n; i++) {

sum += s[i];

/**********found**********/

if (2 == 0) {

w[k] = sum / 5;

/**********found**********/

3;

k++;

}

}

for (i = 0; i < k; i++)

printf("%6.2f ", w[i]);

return 0;

}

输入说明

输入一个正整数n,表示s数组中元素的个数。

输出说明

根据源程序所给格式进行输出

cpp 复制代码
#include <stdio.h>

#define SIZE 100

int main() {

	double s[SIZE], w[SIZE / 5];

	int i, k, n;

    double sum;

	scanf("%d", &n);

	for (k = 2, i = 0; i < n; i++) {

		s[i] = k;

		/**********found**********/

		k=k+2;//从二开始的偶数

	}

	sum = 0.0;

	for (k = 0, i = 0; i < n; i++) {

		sum += s[i];

		/**********found**********/

		if ((i+1)%5 == 0) {//每5个求平均

			w[k] = sum / 5;

			/**********found**********/

			sum=0;//对sum归零

			k++;

		}

	}

	for (i = 0; i < k; i++)

		printf("%6.2f ", w[i]);

	return 0;

}

总结:题目逻辑:1.存偶数 2.每五个求avg 3,存入

二、

大于均值的数(填空)

作者: Turbo

时间限制: 1s

章节: 一维数组

问题描述

给定程序的功能是:计算x数组中N个数的平均值(规定所有数均为正数),然后输出;并将大于平均值的数放在数组y中,并输出。

例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为:30.500000

并输出:46 32 40 45 48

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。

不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include <stdlib.h>

#include <stdio.h>

#define N 100

int main() {

    int i, j;

	double av;

	int n;

	double x[N], y[N];

	scanf("%d", &n);

	for (i = 0; i < n; i++) {

		scanf("%lf", &x[i]);

	}

	/**********found**********/

	 av = 0;//赋予初值

	/**********found**********/

	for (i = 0; i < n; i++)

		av = av + x[i]/n;//求平均值

	for (i = j = 0; i < n; i++)

		/**********found**********/

		if (x[i] > av)

			y[j++] = x[i];//给数组赋值 并跟新其中指针

	y[j] = -1;

	printf("average=%f\n", av);

	for (i = 0; y[i] >= 0; i++)

		printf("%5.1f ", y[i]);

	return 0;

}

总结:1.求各个平均 2.判断大于av的存入 3.输出

三、

环形矩阵(填空)

作者: Turbo

时间限制: 1s

章节: 二维数组

问题描述

给定程序的功能是建立一个n*n的矩阵。 矩阵元素的构成规律是:

最外层元素的值全部为1;从外向内第2层元素的值全部为2;第3层元素的值全部为3,依次类推。例如,若n=5,生成的矩阵为:

1 1 1 1 1

1 2 2 2 1

1 2 3 2 1

1 2 2 2 1

1 1 1 1 1

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include  <stdio.h>

#define N 15

int main() {

	int a[N][N] = {0}, i, j, k, m, n;

	scanf("%d", &n);

	if (n % 2 == 0)

		m = n / 2 ;

	else

        /**********found**********/

		m = n/2+1;//一共有m层 奇数+1

	for (i = 0; i < m; i++) {

		/**********found**********/

		for (j = i ; j < n - i; j++)//横行第一排和最后一排

			a[i][j] = a[n - i - 1][j] = i + 1;

		for (k = i + 1; k < n - i; k++)

			/**********found**********/

			a[k][i] = a[k][n - i - 1] = i+1;//竖行同理

	}

	for (i = 0; i < n; i++) {

		for (j = 0; j < n; j++)

			printf("%3d", a[i][j]);

		printf("\n");

	}

	return 0;

}

总结:1.先模拟一共有几层 2.一层层赋值 按照横竖分别赋值

四、

矩阵外围旋转(填空)

作者: Turbo

时间限制: 1s

章节: 二维数组

问题描述

给定程序的功能是:有n*n矩阵,将矩阵的外围元素顺时针旋转。操作顺序是:首先将第一行元素的值存入临时数组r,然后使第一列成为第一行,最后一行成为第一列,最后一列成为最后一行,临时数组中的元素成为最后一列。

例如,若n=3,有下列矩阵:

1 2 3

4 5 6

7 8 9

计算结果为

7 4 1

8 5 2

9 6 3

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include <stdio.h>

#define N 10

int main() {

	int t[N][N] = { 0 }, r[N], i, j, n;

	scanf("%d", &n);

	for (i = 0; i < n; i++) {

		for (j = 0; j < n; j++)

			scanf("%d", &t[i][j]);

	}

	for (j = 0; j < n; j++)

		r[j] = t[0][j];//存第一行

	for (j = 0; j < n; j++)

		/**********found**********/

		t[0][n - j - 1] = t[j][0];//第一列成为第一行

	for (j = 0; j < n; j++)

		t[j][0] = t[n - 1][j];//最后一行成为第一列

	/**********found**********/

	for (j = n - 1; j >= 0; j--)

		t[n - 1][n - 1 - j] = t[j][n - 1];//最后一列成为最后一行

	for (j = n - 1; j >= 0; j--)

		/**********found**********/

		t[j][n - 1] = r[j];//临时数组中的元素成为最后一列

	for (i = 0; i < n; i++) {

		for (j = 0; j < n; j++)

			printf("%d\t", t[i][j]);

		printf("\n");

	}

	return 0;

}

总结:模拟题目中的旋转方法 一行一行赋值

五、

主对角线和(填空)

作者: Turbo

时间限制: 1s

章节: 二维数组

问题描述

给定程序的功能是:先从键盘上输入一个3行3列矩阵的各个元素的值,然后输出主对角线(从左上到右下的对角线)元素之和。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include <stdio.h>

int main() {

	int a[3][3], sum;

	int i, j;

	/*********found**********/

	sum=0;//加法前要累加

	for (i = 0; i < 3; i++) {

		for (j = 0; j < 3; j++)

			/*********found**********/

			scanf("%d", &a[i][j]);//进行输入赋值

	}

	for (i = 0; i < 3; i++)

	    /*********found**********/

		sum = sum+a[i][i];//累加对角线

	printf("Sum=%d\n", sum);

	return 0;

}

总结:1.输入赋值 2.累加初始化为0

六、

修改信息(填空)

作者: Turbo

时间限制: 1s

章节: 结构体

问题描述

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。

函数fun的功能是对形参b所指结构体变量中的数据进行修改,将学号加上10,姓名修改为"LiJie",最后在主函数中输出修改后的数据。

例如:b所指变量t中的学号、姓名、和三门课的成绩依次是:10002、"ZhangQi"、93、85、87,修改后输出t中的数据应为:10012、" LiJie"、93、85、87。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。

cpp 复制代码
#include  <stdio.h>

#include  <string.h>

struct student {

         long sno;

         char name[10];

         float score[3];

};

void fun(struct student b[]) {

         /**********found**********/

         b->sno += 10;//学号+10

         /**********found**********/

         strcpy(b->name, "LiJie");//改名字

}

int main() {

         struct student t;

         int i;

         scanf("%d%s%f%f%f", &t.sno, &t.name, &t.score[0], &t.score[1], &t.score[2]);

         /**********found**********/

         fun(&t);//结构体函数传参格式

         printf("No: %ld Name: %s\nScores: ", t.sno, t.name);

         for (i = 0; i < 3; i++)

                   printf("%6.2f ", t.score[i]);

         printf("\n");

        return 0;

}

总结:函数中定义的是结构体数组 1.传参要传地址&t

2.结构体引用

strcpy(b[0].name, "LiJie"); // ✅ 方式1:使用下标

strcpy(b->name, "LiJie"); // ✅ 方式2:使用箭头运算符

七、

年龄最大(填空)

作者: Turbo

时间限制: 1s

章节: 结构体

问题描述

给定程序中,函数fun的功能是:将形参std所指结构体数组中年龄最大者的数据作为函数值返回,并在main函数中输出。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。

不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include <stdio.h>

typedef struct {

         char name[10];

         int age;

} STD;

STD fun(STD std[], int n) {

         STD max;

         int i;

         /**********found**********/

         max.age = 0;//设置max初值

         for (i = 1; i < n; i++)

                   /**********found**********/

                   if (max.age < std[i].age)

                            max = std[i];

         return max;

}

int main() {

         STD std[5];

        int i;

        for (i = 0; i < 5; ++ i) {

                   scanf("%s%d", &std[i].name, &std[i].age);

         }

         STD max;

         max = fun(std, 5);

         /**********found**********/

         printf("Name : %s, Age : %d\n", max.name, max.age);

         return 0;

}

总结:1.传参结构体数组 2.内部比较找max结构体并返回

学生排序(填空)

作者: Turbo

时间限制: 1s

章节: 结构体

问题描述

程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。

函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。

不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include  <stdio.h>

#include  <string.h>

struct student {

         long sno;

         char name[10];

         float score[3];

};

void fun(struct student a[], int n) {

         /**********found**********/

         struct student t;//定义交换的tmp t

         int i, j;

         /**********found**********/

         for (i = 0; i < n; i++) //排序

                   for (j = i + 1; j < n; j++)

                            /**********found**********/

                            if (strcmp(a[i].name,a[j].name) > 0) {//比较名字大小

                                     t = a[i];

                                     a[i] = a[j];

                                     a[j] = t;

                            }

}

int main() {

         struct student s[100];

         int n = 0;

         scanf("%d", &n);

         int i, j;

         for (j = 0; j < n; j++) {

                   scanf("%ld%s", &s[j].sno, s[j].name);

                   for (i = 0; i < 3; i++)

                            scanf("%f", &s[j].score[i]);

         }

         fun(s, n);

 

         for (j = 0; j < n; j++) {

                   printf("No: %ld Name: %-8s Scores: ", s[j].sno, s[j].name);

                   for (i = 0; i < 3; i++) printf("%6.2f ", s[j].score[i]);

                   printf("\n");

         }

         return 0;

}

总结:选择排序结构体

九、

人员排序(填空)

作者: Turbo

时间限制: 1s

章节: 结构体

问题描述

给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。

不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include <stdio.h>

typedef struct {

         int num;

         char name[10];

} PERSON;

/**********found**********/

void fun(PERSON  std[]) {//定义参数

         /**********found**********/

         PERSON  temp;//结构体tmp

         if (std[0].num > std[1].num) {

                   temp = std[0];

                   std[0] = std[1];

                   std[1] = temp;

         }

         if (std[0].num > std[2].num) {

                   temp = std[0];

                   std[0] = std[2];

                   std[2] = temp;

         }

         if (std[1].num > std[2].num) {

                   temp = std[1];

                   std[1] = std[2];

                   std[2] = temp;

         }

}

int main() {

         PERSON std[3];

         int i;

         for (i = 0; i < 3; ++ i) {

                   scanf("%d%s", &std[i].num, &std[i].name);

         }

         /**********found**********/

         fun(std);//传参

         for (i = 0; i < 3; i++)

                   printf("%d,%s\n", std[i].num, std[i].name);

         return 0;

}

总结:结构体的传参再排序

十、

成绩m高(填空)

作者: Turbo

时间限制: 1s

章节: 结构体

问题描述

给定程序中函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区t数组中,此存储区的首地址作为函数值返回。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序如下。

不得增行或删行,也不得更改程序的结构!

cpp 复制代码
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define N 10

typedef struct ss

{

    char num[10];

    int s;

} STU;

void fun(STU a[], int m, STU t[])

{

    STU b[N];

    int i, j, k;

    for (i = 0; i < N; i++)

        b[i] = a[i];

    for (k = 0; k < m; k++)

    {

        for (i = j = 0; i < N; i++)

            if (b[i].s > b[j].s)

                /**********found**********/

                j = i;//找最大的

        /**********found**********/

        t[k] = b[j];//更新t的值

        b[j].s = 0;

    }

}

int main()

{

    STU a[N] = { 0 };

    STU pOrder[N];

    int i, m;

    for (i = 0; i < N; ++i)

    {

        scanf("%d%s", &a[i].s, a[i].num);

    }

    scanf("%d", &m);

    fun(a, m, pOrder);

    for (i = 0; i < m; i++)

        /**********found**********/

        printf(" %s  %d\n", pOrder[i].num, pOrder[i].s);//输出结果

    return 0;

}

总结:这里传递的pOrder是数组指针,所以是一起被改变的

十一、

质因数

作者: Turbo

时间限制: 1s

章节: 基本练习(循环)

问题描述

将一个正整数N(1<N<32768)分解质因数。例如,输入90,打印出90=2*3*3*5。

输入说明

输入一个正整数

输出说明

按照范例输出。

其中的质因数的输出顺序按照从小到大的顺序。

如果输入的整数本身是质数,则输出形式为:

3=3

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int p[1000];
    int a=n;
    int k=0;
    int f=1;
    while(a!=1)
        {
            for(int i=2;i<n;i++)
                {
                    if(a%i==0)
                    {
                        p[k++]=i;
                        a=a/i;
                        f=0;
                        break;
                    }
                }
            if(f==1) break;
        }
    if(f==1) 
    {
        cout<<n<<"="<<n;
    }else
    {
        cout<<n<<"="<<p[0];
       for(int i=1;i<k;i++)
        {
            cout<<"*"<<p[i];
        }  
    }
    return 0;
}

总结:从小的因数开始计算 能除尽就放入

十二、

谁是老二?

作者: Turbo

时间限制: 1s

章节: 一维数组

问题描述

一维数组中存储不超过100个整型数据,请找出其中第二大的元素,输出这些元素的值以及它们的下标。

注意,由于元素值可能相同,因此具有最大值的元素个数可能不只一个,第二大的元素是比它们小的那些元素。

输入说明

用户可输入多组数据,每组数据由两行组成:

第一行:数组元素的个数n

第二行:n个数组元素,由空格分隔

输出说明

对于每组输入,输出一行,包含第二大的元素的值以及它们的下标(都是整数),整数之间以空格分隔。如果有多个下标,则下标按从小到大的顺序输出。每行的开头与结尾无多余空格。

每组输出占一行。

如果不存在第二大的元素,则输出"none"(不包含引号)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int a[1000];
    int b[1000];
    while(cin>>n)
        {
            for(int i=0;i<n;i++)
                {
                    cin>>a[i];
                    b[i]=a[i];
                }
            int max=0;
            int k;
            for(int i=1;i<=2;i++)
                {
                    max=-99999;
                    for(int j=0;j<n;j++)
                        {
                            if(b[j]>max)
                            {
                                max=b[j];
                            }
                        }
                    for(int j=0;j<n;j++)
                        {
                            if(b[j]==max)
                            {
                                b[j]=-99999;
                            }
                        }
                }
            if(max!=-99999)
            {
                 cout<<max;
              for(int j=0;j<n;j++)
                {
                    if(a[j]==max)
                    {
                        cout<<" "<<j;
                    }
                }
              cout<<endl;
            }else
            {
                cout<<"none"<<endl;
            }
        }
}

总结:先找第二个最大的值是多少,再筛选所有等于这个值的索引

十三、

骑士斗恶龙

作者: Turbo

时间限制: 1s

章节: 一维数组

问题描述

你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(也就是砍掉所有的头)。

村里有m个骑士可以雇佣,一个能力值为 x 的骑士可以砍掉恶龙一个直径不超过 x 的头,且需要报酬 x 个金币。

如何雇佣骑士才能砍掉恶龙所有的头,并且支付最小的金币?

注意,一个骑士只能砍一个头并且仅能被雇佣1次。

输入说明

输入包含多组测试数据。

每组测试数据的第一行输入两个整数n和m(m和n都在1到20000 之间), n表示龙拥有的头的数目 , m表示王国中的骑士数。

接下来的 n 个整数为龙头的直径,再接下来m个整数为骑士的能力值。

输出说明

对于每组测试数据, 输出一行包含国王杀死龙需要支付的最低数量的金币。如果骑士不可能杀死龙, 输出一行:

"Lose!"(输出不包含引号)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m)
        {
            int d[1000];
            int x[1000];
            for(int i=1;i<=n;i++)
                {
                    cin>>d[i];
                }
            for(int j=1;j<=m;j++)
                {
                    cin>>x[j];
                }
            sort(d+1,d+1+n);
            sort(x+1,x+1+m);
            int sum=0;
            int k=1;
            int i=1;
            int f=1;
            while(i!=(n+1))
                {
                    if(d[i]<=x[k])
                    {
                        sum=sum+x[k];
                        k++;
                        i++;
                    }else
                    {
                        k++;
                    }

                    if(k==(m+1)&&i<=n)
                    {
                        f=0;
                        break;
                    }
                }
            if(f==0)
            {
                cout<<"Lose!"<<endl;
            }else
            {
                cout<<sum<<endl;
            }
        }
    return 0;
}

总结:使用贪心算法 sort函数匹配最近的x

十四、

蛇形方阵

作者: Turbo

时间限制: 1s

章节: 二维数组

问题描述

输出一个如下的n阶方阵。例如,若读入11,则输出:

输入说明

输入一个正整数n(n<20),表示需要输出n阶方阵。

输出说明

共输出n行n列,每个整数占4位,不足4位则左边补空格。

每行的最后无空格。

无多余空行。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int f=1;
    int a[100][100];
    int num=1;
    for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                {
                    if(i%2==1)
                    {
                        a[i][j]=num;
                        num++;
                    }else
                    {
                        a[i][n-j+1]=num;
                        num++;
                    }
                }
        }
    for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                {
                    printf("%4d",a[i][j]);
                }
            cout<<endl;
        }
    
    return 0;
}

总结:蛇形一行行模拟输入

十五、

单词统计

作者: wanyan

时间限制: 1s

章节: 字符串

问题描述

从键盘上输入一个整数N,并输入N行字符串。每行字符串都包含多个单词,单词之间以空格分开。请输出每行字符串中单词的个数。

说明:以空格分隔开的任何字符串都认为是单词。比如"I'm"认为是一个单词

输入说明

首先输入一行,包含一个整数N,表示共测试N组数据。

后面接着输入N行,每行为一个字符串,字符串长度小于等于50。每个字符串中包含多个单词,单词之间以空格分隔。

输出说明

对每组测试数据,你的程序需要向标准输出文件(通常为启动该程序的终端)依次输出字符串中单词的个数。每个输出占一行,在行首和行尾不要输出多余的空格。在所有数据前后,以及两组数据之间不要输出多余的空行。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    cin.get();
    for(int loop=1;loop<=n;loop++)
        {
            string str;
            getline(cin,str);
            int len=1;
            string s=str;
            int flag=1;
            if(str[0]==' ')
            {
                for(int i=0;i<str.length();i++)
                    {
                        if(str[i]!=' ')
                        {
                            s=str.substr(i,str.length()-i);
                            flag=0;
                        }
                    }
             if(flag==1) 
             {
                cout<<0<<endl;
                continue;               
             }
            }
            int f=1;
            for(char c:s)
                {
                    if(f==1&&c==' ')
                    {
                        f=0;
                    }
                    if(f==0&&c!=' ')
                    {
                        f=1;
                        len++;
                    }
                    
                }
            cout<<len<<endl;
        }
    return 0;
}

总结:整体思想是1.先统一开头无空格 2.然后利用f标志,空格后找到的字母就len++

十六、

转换成十进制

作者: Turbo

时间限制: 1s

章节: 字符串

问题描述

编写一个程序,将一个2~20以内任意进制数转换成十进制。这些数据由数字0-9,大写字母A-J组成,其中A=10,B=11......J=19。例如16进制数5A转换为十进制数90(90=5*16+10*1)。

输入说明

程序需要输入多组数据,每组数据一行,每行有两个数,用空格隔开,分别表示当前进制数和被转换的数据。输入数据十进制数大小不会超过10000,例如:16 5A 表示将16进制数5A转换成10进制数。

输出说明

对于每行输入数据需输出一个结果。每个结果为一个十进制的数。例如:16 5A需输出结果90。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    string s;
    while(cin>>n>>s)
        {
            int len=s.length();
            int sum=0;
            int k=1;
            for(int i=len-1;i>=0;i--)
                {
                    if(isalpha(s[i]))
                    {
                        sum=sum+k*(s[i]-'A'+10);
                    }else
                    {
                        sum=sum+k*(s[i]-'0');
                    }
                    k=k*n;
                }
            cout<<sum<<endl;
        }
}

总结:模拟进制累加的方式 每一位乘进制数次方

十七、

十进制转换成其它进制

作者: Turbo

时间限制: 1s

章节: 字符串

问题描述

编写一个程序,将一个十进制数转换成任意的2~20以内的其他进制数。这些数据由数字0-9,字母A-J组成,其中A=10,B=11......J=19。例如90转换为16进制数为5A(90=5*16+10*1)。

输入说明

程序需要输入多组数据,每组数据一行,每行有两个数,用空格隔开,分别表示十进制数和转换成的进制数。输入数据不会超过10000,例如:90 16 表示将90转换成16进制数。

输出说明

对于每行输入数据需输出一个结果。每个结果包含为一个20以内的进制的数。输出的字母都为大写字母。例如:90 16需输出结果5A。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int m;
    while(cin>>n>>m)
        {
            string sum;
            while(n!=0)
                {
                    int tmp=n%m;
                    char t;
                    if(tmp<10)
                    {
                        t=tmp+'0';
                    }else
                    {
                        t='A'+tmp-10;
                    }
                    sum=t+sum;
                    n=n/m;
                }
            cout<<sum<<endl;
        }
}

总结:字符串进制转换 先除余后整除

十八、

最大相同子串

作者: Turbo

时间限制: 1s

章节: 字符串

问题描述

输入两个字符串,获取两个字符串中最长相同子串并输出。

如果有多个相同子串,则输出(按ASCII排序)最小的那个"最长相同子串"。

如果无相同子串,则输出空字符串(即空行)。

输入说明

输入多组测试数据,每组测试数据包含两行。

每行包含一个字符串,字符串中无空格,也无空字符串。

输出说明

对于每组测试数据,输出最长子串。如果最长子串为空,则输出一个空行。

每组输出占一行,行首与行尾无多余空格,也无多余空行。

输入范例

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
bool find(string a,string b)
{
    int lena=a.length();
    int lenb=b.length();
    for(int i=0;i<=lena-lenb;i++)
        {
            if(a.substr(i,lenb)==b)
            {
                return true;
            }
        }
    return false;
}
bool cmp(string a,string b)
{
    return a<b;
}
int main()
{
    string a,b;
    string end[1000];
    while(cin>>a>>b)
        {
            int lena=a.length();
            int lenb=b.length();
            if(lena<lenb) swap(a,b);
             lena=a.length();
             lenb=b.length();
            int f=1;
            for(int i=lenb;i>=1;i--)
                {
                    int k=1;
                    for(int j=0;j<=lenb-i;j++)
                        {
                            string tmp=b.substr(j,i);
                            if(find(a,tmp))
                            {
                               end[k++]=tmp;   
                            }
                        }
                    if(k==2)
                    {
                        f=0;
                        cout<<end[1]<<endl;
                        break;
                    }else if(k>2)
                    {
                        f=0;
                        sort(end+1,end+k,cmp);
                        cout<<end[1]<<endl;
                        break;
                    }
                }
            if(f==1) cout<<endl;
        }
}

总结:1.从长度开始遍历 最大长度开始 2.每一个相同长度 比较该长度下的不同字符串 3.进行find函数看该字符串是否在更长的主字符串中

十九、

冰雹数

作者: Turbo

时间限制: 1s

章节: 循环

问题描述

任意给定一个大于1的正整数N,

如果是偶数,执行: N / 2

如果是大于1的奇数,执行: N * 3 + 1

生成的新的数字再执行同样的动作,循环往复。

通过观察发现,这个数字会一会儿上升到很高,

一会儿又降落下来。

就这样起起落落的,但最终必会落到"1"

这有点像小冰雹粒子在冰雹云中翻滚增长的样子。

比如N=9

9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1

可以看到,N=9的时候,这个"小冰雹"最高冲到了52这个高度。

输入一个整数M,请输出一个正整数,表示所有不大于M的数字N中,经过冰雹数变换过程中,最高冲到了多少。

注意:从2到M这M-1个数字中,每一个数字N都能得到一系列冰雹数,需要求得所有冰雹数的最大值。

输入说明

从标准输入设备输入一个正整数M(1<M<10000)

输出说明

输出一个正整数,表示结果。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int max=0;
    for(int i=2;i<=n;i++)
        {
                int a=i;
           while(a!=1)
        {
            if(max<a) max=a;
            if(a%2==0)
            {
                a=a/2;
            }else
            {
                a=a*3+1;
            }
        }
        }
    cout<<max;
    return 0;
}

总结:因为每一个必回落到1 只要计算每一组的最大值并跟新就好了

二十、

小数第n位

作者: Turbo

时间限制: 1s

章节: 基本练习(循环)

问题描述

我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。

如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。

本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。

输入说明

一行,三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)

输出说明

一行,3位数字,表示:a除以b,小数后第n位开始的3位数字。

比如输入:

1 8 3

则输出

500

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    int n;
    cin>>n;
	int end;
    int zhengshu=a/b;
    for(int i=1;i<n;i++)
        {
            a=a%b*10;
            end=a/b;
        }
    for(int i=1;i<=3;i++)
        {
            a=a%b*10;
            end=a/b;
            cout<<end;
        }
    return 0;
}

总结:关键在于模拟竖式除法,整除得位数,取余*10得下一个被除数

翻译:

Generative AI refers to models that can generate new data similar to the training data. Popular generative models include Generative Adversarial Networks (GANs) and diffusion models. These models have been successfully applied in image synthesis , text generation, and audio creation. In a GAN framework, a generator and a discriminator compete with each other, improving the quality of generated data over time. Diffusion models, on the other hand, generate data by gradually removing noise from random inputs. Generative AI has shown great potential in fields such as content creation, drug discovery, and virtual reality. However, it also raises ethical concerns, including misinformation and data privacy issues, which require careful regulation.

生成式人工智能指能够生成与训练数据相似新数据的模型。流行的生成模型包括生成对抗网络(GAN)和扩散模型。这些模型已成功应用于图像合成、文本生成和音频创作领域。在GAN框架中,生成器与判别器相互博弈,随时间推移提升生成数据质量。而扩散模型则通过逐步去除随机输入中的噪声来生成数据。生成式AI在内容创作、药物研发和虚拟现实等领域展现出巨大潜力,但也引发了包括虚假信息和数据隐私在内的伦理问题,需要审慎监管。

相关推荐
汉克老师2 小时前
GESP5级C++考试语法知识(十二、递归算法(二))
c++·算法·记忆化搜索·时间复杂度·递归算法·gesp5级·gesp五级
lcreek2 小时前
计算机网络与图算法:从理论到实践
算法·
sinat_255487812 小时前
JSON·学习笔记
java·开发语言·笔记·算法
Yupureki2 小时前
《算法竞赛从入门到国奖》算法基础:动态规划-基础线性dp
c语言·开发语言·算法·动态规划
Roselind_Yi2 小时前
从线性回归实战到Python依赖安装踩坑:我的机器学习入门排雷记
笔记·python·算法·机器学习·回归·线性回归·学习方法
宵时待雨2 小时前
C++笔记归纳15:红黑树
开发语言·数据结构·c++·笔记
黑眼圈子2 小时前
牛客刷题记录5
java·开发语言·学习·算法
罗湖老棍子2 小时前
【例 2】A Simple Problem with Integers(信息学奥赛一本通- P1548)
数据结构·算法·线段树·区间修改 区间查询
abant22 小时前
leetcode 148 排序链表 归并终极形态
算法·leetcode·链表