蓝桥杯——练习(2.27)

蓝桥杯——练习(2.27)

基础练习 特殊回文数

题目链接:http://lx.lanqiao.cn/detail.page?submitid=5515856

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

输入一行,包含一个正整数n。

输出格式

按从小到大的顺序输出满足条件的整数,每个整数占一行。

样例输入

52

样例输出

899998
989989
998899

数据规模和约定

1<=n<=54。

解题思路

  • 分析本题目,特殊回文数就是从左边读和从右边读都是一样的。

  • 题目要求输出所有的这样的五位和六位十进制数。

  • 可以利用枚举来进行判断是否符合题目要求,用n表示输入的数,也就是各位数的和为n。

  • left表示左边部分,right表示右边部分,数组a存放数据的每一位数,Num表示每次的数,用变量t来存放每一次的Num值。

  • 先判断t是五位数还是六位数,如果是五位数,将t的每一位取出放到a中,然后判断每位的和是否与n相等,如果和n相等,left=a[0]*10+a[1];right=a[4] *10+a[3],接着判断left与right是否相等,相等则输出Num;

  • 如果是六位数,将每一位放到a中,判断六位的和是否与n相等,如果相等,left=a[0] * 100+a[1] * 10+a[2],right=a[5] * 100+a[4] * 10+a[3];如果left与right相等,输出Num的值。

代码

#include<iostream>
using namespace std;
int main()
{
	int n,left,right,i;
	int t=0;
	int Num=10000;
	int a[6];
	cin>>n;
	for(Num;Num<1000000;Num++)
	{
		i=0;
		t=Num;
		if(t<100000)
		{
			while(t)
			{
				a[i++]=t%10;
				t/=10;
			}
			if(a[0]+a[1]+a[2]+a[3]+a[4]==n)
			{
				left=a[0]*10+a[1];
				right=a[4]*10+a[3];
				if(left==right)
				{
					cout<<Num<<endl;
				}
			}
		}
		else
		{
			while(t)
			{
				a[i++]=t%10;
				t/=10;
			}
			if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]==n)
			{
				left=a[0]*100+a[1]*10+a[2];
				right=a[5]*100+a[4]*10+a[3];
				if(left==right)
				{
					cout<<Num<<endl;
				}
			}
		}
	}
	return 0;
}

视频学习——使用sort排序练习

视频链接:https://www.bilibili.com/video/BV1jE411g76D?p=5

学习心得

  • 使用sort函数需要引入头文件algorithm,round函数是四舍五入的,浮点数的绝对值用fabs函数,均在头文件cmath中,如果要使用这些函数,要引入头文件。

  • 输出的时候用printf时,%lf和%f默认都是六位,与%.6f相同。输出的时候要注意行末空格的问题,先判断一下是不是最后一位,如果不是将数据打出并加上空格,如果是最后一位,直接输出数据即可,最后循环结束的时候,最好打印一下换行。

  • c风格字符串用strlen求字符串的长度,需要引入头文件cstring。

  • 结构体排序的时候要保证每一位都能够进行比较。

题目练习 集合运算

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T53

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。

输入格式

第一行为一个整数n,表示集合A中的元素个数。
  第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
  第三行为一个整数m,表示集合B中的元素个数。
  第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
  集合中的所有元素均为int范围内的整数,n、m<=1000。

输出格式

第一行按从小到大的顺序输出A、B交集中的所有元素。
  第二行按从小到大的顺序输出A、B并集中的所有元素。
  第三行按从小到大的顺序输出B在A中的余集中的所有元素。

样例输入

5
1 2 3 4 5
5
2 4 6 8 10

样例输出

2 4
1 2 3 4 5 6 8 10
1 3 5

样例输入

4
1 2 3 4
3
5 6 7

样例输出

1 2 3 4 5 6 7
1 2 3 4

代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	int n,m,i;
	int value;
    vector<int> v1;
    vector<int> v2;
    vector<int> v3;
    vector<int> v4;
    vector<int> v5;
    cin>>n;
    for(i=0;i<n;i++)
	{
        cin>>value;
        v1.push_back(value);
    }
    cin>>m;
    for(i=0;i<m;i++)
	{
       	cin>>value;
        v2.push_back(value);
    }
    sort(v1.begin(),v1.end());
    sort(v2.begin(),v2.end());
    //求交集
    set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v3));
    if(v3.size()!=0)
	{
        for(i=0;i<v3.size();i++)
		{
            cout<<v3[i]<<" ";
        }
        cout<<endl;
    }
    //求并集
    set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v4,v4.begin()));
    for(i=0;i<v4.size();i++)
	{
        cout<<v4[i]<<" ";
    }
    cout<<endl;
    //求差集
    set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v5,v5.begin()));
    for(i=0;i<v5.size();i++)
	{
        cout<<v5[i]<<" ";
    }
    return 0;
}