2019年1月30日训练日记

今天写的有取绝对值问题,越界处理问题,二个奇数次问题,字符串所在位置问题(字符所在位置问题就不注明了)

先把之前的“越界了吗”这个问题写上:

2101 越界了吗

输入两个int范围内的整数a和b,
你需要判断如果a和b都是用int类型存储的,a+b在C++中是否越界了(也就是结果是否还在int范围内)。
注意越界有上界和下界。
输入
一行两个整数a和b
输出
如果越界了,输出Yes
否则输出No
输入样例

2147483647 1

输出样例

Yes

解题之前先写一下有关取绝对值的知识点:

abs、fabs、fabsf三个函数都是用来求一个数的绝对值,区别如下:
1)int abs(int a); // 处理int类型的取绝对值
2)double fabs(double a); //处理double类型的取绝对值
3)float fabsf(float a); //处理float类型的取绝对值

代码如下:

代码一:

#include <bits/stdc++.h> 
using namespace std;
int main()
{
	long long a,b;
	long long max,min,c;
	max = INT_MAX;
	min = INT_MIN;
	cin >> a >> b;
//	cout << a << "  " << b <<endl;
/*	while (!(a<=max && a >=min && b<=max && b>=min ))
		{
		cout << "input out of range";
		cin >> a >> b; 
		}*/
	c = a + b;
//	cout << max <<endl << c << endl << min <<endl;  
	if (c > max || c < min)
	{
		cout << "Yes";
	}
	else
	{
		cout << "No";
	}
	return 0;
}

利用函数直接确定int 的最大值与最小值。
代码二:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,c,m,n,o;
    cin>>a>>b;
    c=a+b;m=a%10;n=b%10;o=c%10;
    if(fabs(a)>fabs(b)) swap(a,b);
    if(b>0&&c<0||b<0&&c>0) cout<<"Yes";
    else if(m+n!=o||(m+n)%10!=o) cout<<"Yes";
    else cout<<"No";
return 0;
}

利用分别取余来计算。

再写一个之前的“二个奇数次”问题:

2107 二个奇数次

输入一个长度为n的数组,考虑所有不同的数字,有且只有2个数字出现了奇数次。

比如对于1 2 3 1 2 3 1 2,我们考虑所有不同的数字1 2 3,有且只有1,2出现了奇数次(均为3次)

输出这两个出现了奇数次的数字。

先输出这两个数字中较小的,再输出较大的。

1 <= n <= 100000

1 <= a[i] <= 10^9

输入
第一行一个整数n,
接下来一行n个整数,表示输入的数字。
输出
一行2个数字,表示出现了奇数次的数字,先输出小的,再输出大的。
输入样例

8
1 2 3 1 2 3 1 2

输出样例

1 2

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int b,c,i,m,n,o=0,d=0,e=0,f=5,g;
    scanf("%d",&n);int a[n];
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    sort(a,a+n);
    for(i=0;i<n;i++)
    {
        if(a[i]==a[i+1]) i++;
        else if(o==0) {o++;printf("%d",a[i]);}
        else if(o==1) {printf(" %d",a[i]);break;}
    }
return 0;
}

利用偶数特点,直接跳过相等的数的第二个值: if(a[i]==a[i+1]) i++;(因为在for循环中i的下一次循环本身就该加1),这样就可以只捕获奇数次的值。

再写一个字符串的问题:

2149 字符串出现位置

给你两个字符串,一个母串,一个子串,请你找出子串第一次在母串中出现的位置。如果子串没有在母串中出现过,则输出-1。
例如子串ab在母串dceab中第一次出现的位置是3,而子串abc则在dceab中没有出现过。
输入
第一行一个字符串(母串),保证每个字符都是小写字母。
第二行一个字符串(子串),保证每个字符都是小写字母。
保证两个字符串的长度都不超过10000,并且大于0。
输出
一行一个整数,表示子串第一次在母串中出现的位置。假如子串没有在母串中出现过,则输出-1。

输入样例

decdagee
age

输出样例

4

代码如下:(我写的有点乱,也有点复杂。。。不过好像运行效率还可以。。。)

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<iomanip>
using namespace std;
char a[10001],b[10001],c[10001];
int main()
{
    int s=0,y=0,h=0;
    gets(a);gets(b);
    for(int i=0;i<strlen(a);i++)
    {
        if(b[0]==a[i])
        {
           for(int j=i;j<i+strlen(b);j++)
                {
                    c[h]=a[j];
                    h++;
                }
            for(int x=0;x<strlen(b);x++)
            {
                if(b[x]==c[x])
                {
                    y++;
                }
            }
            if(y==strlen(b))
            {
                    s++;
                 cout<<i<<endl;
                 break;
            }

        }
        h=0;
        y=0;
    }
    if(s==0)
    cout<<"-1";
    return 0;
}

注意的问题:h,y等最后一定要清零。。。

原文地址:https://www.cnblogs.com/study-hard-forever/p/12130071.html