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等最后一定要清零。。。