蓝桥杯_算法训练1

(1)数据交换
问题描述
编写一个程序,输入两个整数,分别存放在变量x和y当中,然后使用自己定义的函数swap来交换这两个变量的值。
输入格式:
输入只有一行,包括两个整数。
输出格式:
输出只有一行,也是两个整数,即交换以后的结果。
要求:
主函数负责数据的输入与输出,但不能直接交换这两个变量的值,必须通过调用单独定义的函数swap来完成,而swap函数只负责交换变量的值,不能输出交换后的结果。
输入输出样例
样例输入
4 7
样例输出
7 4
代码

#include <stdio.h>
int swap(int *p1,int *p2);
int main()
{
 int a,b;
 scanf("%d %d",&a,&b);
 swap(&a,&b);
 printf("%d %d",a,b);
 return 0;
 } 
 int swap(int *p1,int *p2)//题目要求定义的swap函数
{
 int p3;
 p3=*p1;
 *p1=*p2;
 *p2=p3;
 return *p1,*p2;
}

(2)矩阵乘法
问题描述  
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式  
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数。
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值。
输出格式  
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开。
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
代码

#include <stdio.h>
int n, m;
int a[31][31];
int b[31][31];
int c[31][31];
//矩阵a是原数据,不会变
//矩阵b是乘a后的矩阵,相当于个中间变量 
//矩阵c是存放最后结果的矩阵 
void f(void)
{
    int i, j, times, sum, q=0;
 //判断0次幂的情况,输出单位矩阵 
    if(m==0)
    {
 for(i=1; i<=n; ++i)
     for(j=1; j<=n; ++j)
     {
       if(i==j)
         a[i][j] = 1;
      else
         a[i][j] = 0;
   }
  for(i=1; i<=n; ++i)
  { 
    for(j=1; j<=n; ++j)
       printf("%d ", a[i][j]);
      printf("\n"); 
  }
   return;
    }
 //如果1次幂就输出本身 
    if(m==1)
    {
   for(i=1; i<=n; ++i)
   { 
     for(j=1; j<=n; ++j)
      printf("%d ", a[i][j]);
     printf("\n"); 
   } 
   return;
    }
    for(times=1; times<m; ++times) //矩阵相乘的次数 
    {
   for(i=1; i<=n; ++i)   //行标,第i行,行数 
    for(q=1; q<=n; q++)  //矩阵每一行都分别乘以全部列,共n列,每列一次 
   {
     sum = 0;   //初始化为零 
      for(j=1; j<=n; ++j)
       sum += b[i][j]*a[j][q];  //经过一次行乘以列 
      c[i][q] = sum;   //更新结果 
    }
  for(i=1; i<=n; ++i)
    for(j=1; j<=n; ++j)
       b[i][j] = c[i][j];  //让矩阵b等于c,进行后续计算 
    }
 //打印出结果 
    for(i=1; i<=n; ++i)
    {
   for(j=1; j<=n; ++j)
   printf("%d ", c[i][j]);
  printf("\n");
    }
  return;
}
int main()
{
 int i, j;
  scanf("%d %d", &n, &m);
 //输入矩阵a 
  for(i=1; i<=n; ++i)
   for(j=1; j<=n; ++j)
    scanf("%d", &a[i][j]);
 //赋值于矩阵b,让其和a相同 
  for(i=1; i<=n; ++i)
   for(j=1; j<=n; ++j)
    b[i][j] = a[i][j]; 
  f(); 
  return 0;
}

(3)加法运算
问题描述
你的表妹正在学习整数的加法,请编写一个程序来帮助她学习。该程序调用了一个函数GetTwoInts,由它来返回两个从键盘读入的100以内的整数,然后计算这两个整数之和,并把答案显示出来。要求:在主函数中不能使用scanf等函数直接输入这两个整数,而必须通过调用GetTwoInts函数来完成,在GetTwoInts函数中可以使用scanf函数。另外,由于该函数必须同时返回两个整数,因此不能采用函数返回值的方式,而必须采用指针的方法来实现。
输入格式:
输入只有一行,即两个100以内的整数。
输出格式:
输出只有一行,即这两个整数之和。
输入输出样例
样例输入
4 7
样例输出
11
代码

#include <stdio.h>
void GetTwoInts(int* x, int* y) {
 scanf("%d %d", x, y);
}
int main() {
 int a, b;
 int* x, * y;
 x = &a;
 y = &b;
 int result;
 GetTwoInts(x, y);
 result = *x + *y;
 printf("%d", result);
 return 0;
}

(4)景点游览
问题描述  
小明来到一个景区游玩,但是他的时间有限,没办法逛遍所有的景点,所以他从网上下载了每个景点的评分,他希望能够使游览的景点的评分总和最高,于是他希望你帮他对于N个景点排下序。
输入格式  
输入的第一行包含一个正整数N,表示N个景点。
第二行有N个正整数,表示每个景点的评分值。
输出格式  
输出一行,包含N个正整数,表示N个景点的评分从大到小的排列
样例输入
4
3 2 4 1
样例输出
4 3 2 1
代码

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
 int n;
 int score[1000];
 cin >> n;
 for (int i = 0; i < n; i++)
 {
  cin >> score[i];
 }
 sort(score, score + n);//从小到大排好
 reverse(score, score + n);//反转数组元素
 for (int i = 0; i < n; i++)
 {
  cout << score[i] << " ";
 }
 return 0;
}

(5)大等于n的最小完全平方数
问题描述  
输出大等于n的最小的完全平方数。
若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数
Tips:注意数据范围
所以:n是32位有符号整数,那么输入的值最大可能为2147483647,要求的答案超过了int的范围,所以应该用long long int确保答案不会溢出。
输入格式  
一个整数n
输出格式  
大等于n的最小的完全平方数
样例输入
71711
样例输出
71824
数据规模和约定  
n是32位有符号整数
代码

#include <stdio.h>
#include <math.h>
int main()
{
    double n;
    long long int root;
    scanf("%lf", &n);
    root = (long long int)ceil(sqrt(n));
    printf("%lld", root * root);
    return 0;
}

(6)出现次数最多的整数
问题描述
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式
第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式
输出只有一行,即出现次数最多的那个元素值。
样例输入
5
100
150
150
200
250
样例输出
150
思路
用一层循环,因为要取较小的那个数,而数组是由小到大排列的,所以从最后一个开始遍历, 如果当前的数和下一个数相等,sum++(记录次数); 并且用max保存出现次数最多的次数,用flag标记数组下标。循环结束时a[flag]即为答案。
需要特殊考虑n<1和n==1的情况。
代码

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    int a[n],i,max,flag,sum;
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    if(n<1) return 0;
    if(n==1) return a[0];
    max=0;flag=0;
    for(i=n-1;i>=0;i--){
        sum=1;
        if(a[i]==a[i-1]){
            sum++;
            if(max<sum){
                sum=max;
                flag=i;
            }
        }
    }
    printf("%d",a[flag]);
    return 0;
} 

(7)求平方和
问题描述  
请用函数重载实现整型和浮点习型的两个数的平方和计算
输入格式  
测试数据的输入一定会满足的格式。
2 2(2行2列,第1行整型,第2行浮点型)
输出格式  
要求用户的输出满足的格式。
2 1(2行1列,第1行整型,第2行浮点型)
样例输入
一个满足题目要求的输入范例。
例:
2 2
3 4
3.1 4.1
样例输出
与上面的样例输入对应的输出。
例:
25
26.42
数据规模和约定  
输入数据中每一个数的范围。
例:0<n,m<100, 0<=矩阵中的每个数<=1000。
代码

#include<iostream>
using namespace std;
int ans(int n,int m){
 int ans;
 ans = n*n+m*m;
 return ans;
}
float ans(float a,float b){
 float ans;
 ans = a*a+b*b;
 return ans;
}
int main(){
 int n,m;
 float a,b; 
 cin>>n>>m;
 cin>>a>>b;
   cout<<ans(n,m)<<endl;
   cout<<ans(a,b);
 return 0;
} 

(8)奇数还是偶数
问题描述  
判断一个数是奇数还是偶数
输入格式  
输入1个整数n
输出格式  
如果是偶数,输出“even”,如果是奇数输出“odd”
样例输入
34
样例输出
even
数据规模和约定  
n<=100000000
代码

#include <stdio.h> 
int main()  
{  
    int n;
    scanf("%d",&n);
    if(n%2!=0) 
    {  
        printf("odd\n");  
    }  
    else  
    {  
        printf("even\n");  
    }
return 0;  
}

(9)实现strcmp函数
问题描述  
自己实现一个比较字符串大小的函数,也即实现strcmp函数。
函数:int myStrcmp(char *s1,char *s2) 按照ASCII顺序比较字符串s1与s2。若s1与s2相等返回0,s1>s2返回1,s1<s2返回-1。
具体来说,两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止(注意’\0’值为0,小于任意ASCII字符)。
如:
  “A”<“B”
  “a”>“A”
  “computer”>“compare”
  “hello”<“helloworld”
代码

#include<stdio.h>
#include<string.h>
int main(){
 char s1[100],s2[100];
 scanf("%s%s",s1,s2);
 int i,j,t=0,k=strlen(s1);
 if(strlen(s1)<strlen(s2)){
  k=strlen(s2);
 }//k表示两个字符串长度中较大的数
 for(i=0;i<k;i++){
  if(s1[i]>s2[i]){//出现s1字符大于对应s2字符的即代表s1>s2所以输出1
   printf("1");
   t=1;//标记是否是相等的情况 
   break;
  }
  else if(s1[i]<s2[i]){
   printf("-1");
   t=1;//标记其是否是相等的情况
   break;
  }
 }
 if(t==0){
  printf("0");
 }
 return 0;
} 

(10)打印十字图
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊)
如下所示:
省略
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) ,表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
代码

#include <stdio.h>
#include <stdlib.h>
int print(int n)
{
 char a[130][130];
 int i,j,x,y;
 int row = 9 + (n - 1) * 4;
 int col = 9 + (n - 1) * 4;
 int cen = (row - 1) / 2;
 // 对所有的数组中数据 赋给字符 "."
 for (i = 0; i < row; i++)
 for (j = 0; j < col; j++)
 {
  a[i][j]='.';
 }
 // 打印左上角的图形( 分成a,b,c 三部分)(然后利用对称赋值输出)
 // 打印a 部分
 for (i = cen; i > 0; i = i - 2) // 打印出 a[4][4] 34 43 22 12 21六个点的字符
 {
  a[i][i] = '$';
  a[i-1][i] = '$';
  a[i][i-1] = '$';
 }
 // 打印b部分 a[2][0] 30 40 42  四个点
 x = 0;
 for (y = 0; y <= (cen - 2); y = y + 2)
 {
  x = x + 2;
  for (i = x; i <= cen; i++)
  {
   a[i][y] = '$';
  }
 }
 // 打印c部分 a[0][2] 03 04 24 四个点
 y = 0;
 for (x = 0; x <= (cen - 2); x = x + 2)
 {
  y = y + 2;
  for (i = y; i <= cen; i++)
  {
   a[x][i] = '$';
  }
 }
 // y轴对称左上半部分对应左下半部分
 for (y = 0; y <= cen;y++)
 for (x = row - 1; x > cen; x--)
 {
  a[x][y] = a[row - 1 - x][y];
 }
 // x轴对称左半部分对应右半部分
 for (x = 0; x < row;x++)
 for (y = col - 1; y>cen; y--)
 {
  a[x][y] = a[x][col-1- y];
 }
 // 输出图形
 for (i = 0; i < row; i++)
 {
  for (j = 0; j < col; j++)
  {
   printf("%c", a[i][j]);
  }
  printf("\n");
 }
 return 0;
}
int main() 
{
 int n;
 scanf("%d", &n);
 print(n);
 return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你小汁完了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值