【深基3.例2】数的性质
#include <iostream>
using namespace std;
int main()
{
int x = 0;
cin >> x;
bool flag1 = !(x&1);
bool flag2 = (x>4 && x<=12);
cout << (flag1 & flag2) << " ";
cout << (flag1 | flag2) << " ";
cout << (flag1 ^ flag2) << " ";
//cout << ((flag1 | flag2) && !flag1&&flag2) << " ";
cout << (!flag1 & !flag2);
return 0;
}
关于!(x&1),这个&按位与的运算符,x首先被转换成补码再与1按位与,因为1为0000000001,所以只对补码的最后1位进行了计算,因为其他都是2的倍数,相加也是倍数,对是否偶数没有影响,1&1=1(奇数),加!即为偶数。
P5711 【深基3.例3】闰年判断
#include <iostream>
using namespace std;
int main()
{
int year = 0;
cin >> year;
cout << ((year%4==0 && year%100!=0) || year%400 == 0);
return 0;
}
P5712 【深基3.例4】Apples
#include <iostream>
using namespace std;
int main()
{
int x = 0;
cin >> x;
if(x <= 1)
{
cout << "Today, I ate " << x << " apple.";
}
else
{
cout << "Today, I ate " << x << " apples.";
}
return 0;
}
x是一个独立的个体前后都要有空格。
P5713 【深基3.例5】洛谷团队系统
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int my = n * 5;
int luo = 11 + 3*n;
if(my < luo)
{
cout << "Local";
}
else
{
cout << "Luogu";
}
return 0;
}
P5714 【深基3.例7】肥胖问题
#include <iostream>
using namespace std;
int main()
{
float m = 0, n = 0;
cin >> m >> n;
float bmi = m / (n*n);
if(bmi < 18.5)
{
cout << "Underweight";
}
else if(bmi < 24)
{
cout << "Normal";
}
else
{
cout << bmi << endl << "Overweight";
}
return 0;
}
注意m和n也得是浮点数类型!
P5715
#include <iostream>
using namespace std;
int main()
{
int a = 0, b = 0, c = 0;
cin >> a >> b >> c;
int tmp = 0;
if(a > b)
{
tmp = a;
a = b;
b = tmp;
}
if(a > c)
{
tmp = a;
a = c;
c = tmp;
}
if(b > c)
{
tmp = b;
b = c;
c = tmp;
}
cout << a << " " << b << " " << c << endl;
return 0;
}
2
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int arr[3] = {0};
cin >> arr[0] >> arr[1] >> arr[2];
sort(arr, arr+3);
cout << arr[0] << " " << arr[1] << " " << arr[2] << endl;
return 0;
}
自带sort函数,语法简单,但要注意(arr+3),是最一个元素后的一个地址。
3
#include <iostream>
//#include <algorithm>
using namespace std;
int main()
{
int a = 0, b = 0, c = 0;
cin >> a >> b >> c;
if(a > b)
{
swap(a, b);
}
if(a > c)
{
swap(a, c);
}
if(b > c)
{
swap(b, c);
}
printf("%d %d %d\n", a, b, c);
return 0;
}
用swap交换
P5716 【深基3.例9】月份天数
#include <iostream>
using namespace std;
int main()
{
int year = 0, mon = 0;
cin >> year >> mon;
int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if((year%4==0 && year%100!=0) || year%400 == 0)
{
month[1]++;
}
cout << month[mon-1];
return 0;
}
注意要输出的是月份!
P1085 [NOIP2004 普及组] 不高兴的津津
#include <iostream>
using namespace std;
int main()
{
int arr[7][2] = {0};
int i = 0;
int j = 0;
int max = 0;
int ans = 0;
for(i=0; i<7; i++)
{
int sum = 0;
for(j=0; j<2; j++)
{
cin >> arr[i][j];
}
sum = arr[i][0] + arr[i][1];
if(sum > 8)
{
if(sum > max)
{
max = sum;
ans = i+1;
}
}
}
cout << ans;
return 0;
}
繁琐做法。
#include <iostream>
using namespace std;
int main()
{
int sch_time = 0, mom_time = 0;
int i = 0;
int max = 0;
int sum = 0;
int ans = 0;
for(i=1; i<8; i++)
{
cin >> sch_time >> mom_time;
sum = sch_time + mom_time;
if((sum>max) && (sum>8))
{
max = sum;
ans = i;
}
}
cout << ans;
return 0;
}
[NOIP2016 普及组] 买铅笔
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int num = 0, price = 0;
int money = 0;
int min = 100000000;
for(i=0; i<3; i++)
{
cin >> num >> price;
money = ceil(n*1.0/num) * price;
if(money < min)
{
min = money;
}
}
cout << min;
return 0;
}
这题解把我看傻了,这题要先看一下,然后这样做就可以了。
注意不要忘了ceil括号中间的数要是浮点数。
P1055 [NOIP2008 普及组] ISBN 号码
#include <iostream>
using namespace std;
int main()
{
char arr[14] = {0};
char mod[12] = "0123456789X";
gets(arr);
int i = 0;
int sum = 0;
int t = 1;
for(i=0; i<11; i++)
{
if(arr[i] == '-')
{
continue;
}
sum += (arr[i]-48)*t++;
}
if(mod[sum % 11] == arr[12])
{
cout << "Right";
}
else
{
arr[12] = mod[sum%11];
cout << arr;
}
return 0;
}
这题因为有个X所以我们可以定义一个数组,用下标的数来标识非数字。
还要注意题目的理解。
P1422 小玉家的电费
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int ele = 0;
float money = 0.0f;
cin >> ele;
if(ele <= 150)
{
money = ele*0.4463;
}
else if(ele <= 400)
{
money = 150*0.4463 + (ele-150)*0.4663;
}
else
{
money = 150*0.4463 + (400-150)*0.4663 + (ele-400)*0.5663;
}
cout << fixed << setprecision(1) << money;
return 0;
}
要注意理解题意,小于150的部分*,>150并且<=400的部分乘,>400的再乘。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int ele = 0;
float money = 0.0f;
cin >> ele;
if(ele <= 150)
{
money = ele*0.4463;
}
else if(ele <= 400)
{
money = 150*0.4463 + (ele-150)*0.4663;
}
else
{
money = 150*0.4463 + (400-150)*0.4663 + (ele-400)*0.5663;
}
money = int(money*10+0.5) / 10.0;
cout << money;
return 0;
}
也可以经过处理让它四舍五入到1位。
关于为什么要*10,比如2.432 + 0.5 = 2.932,再强制类型转换那就是2。这边强转和向下取整一样,作用可以理解为把小数点后的扔掉。
2.432*10 = 24.32,再加0.5时,小数点后一位<0.5时+0.5不进位,>=0.5时+0.5进位,
24.32+0.5 = 24.82。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int ele = 0;
cin >> ele;
double cost[10001] = {0.0};
int i = 0;
for(i=1; i<=150; i++)
{
cost[i] = 0.4463;
}
for(i=151; i<=400; i++)
{
cost[i] = 0.4663;
}
for(i=401; i<=10000; i++)
{
cost[i] = 0.5663;
}
double sum = 0.0;
for(i=1; i<=ele; i++)
{
sum += cost[i];
}
sum = int(sum*10+0.5) / 10.0;
cout << sum;
return 0;
}
一个好思路,非常清晰。
P1424 小鱼的航程(改进版)
#include <iostream>
using namespace std;
int main()
{
int week[7] = {250,250,250,250,250,0,0};
int x = 0, n = 0;
cin >> x >> n;
int sum = 0;
int i = 0;
for(i=0; i<n; i++)
{
sum += week[(x-1+i)%7];
}
cout << sum;
return 0;
}
%7是因为加到7时要%7变会周一,我刚才犯了一个错误——理解错题意,周X算起也在n天之内,所以看清题意是做题的必要条件。
2
#include <iostream>
using namespace std;
int main()
{
int x = 0, n = 0;
cin >> x >> n;
int i = 0;
int sum = 0;
for(i=0; i<n; i++)
{
if(x!=6 && x!=7)
{
sum += 250;
}
x++;
if(x == 8)
{
x = 1;
}
}
cout << sum;
return 0;
}
感觉题解第一个有问题。
P1888 三角函数
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int arr[3] = {0};
cin >> arr[0] >> arr[1] >> arr[2];
sort(arr, arr+3);
cout << arr[0]/__gcd(arr[0], arr[2]) << '/' << arr[2]/__gcd(arr[0], arr[2]);
return 0;
}
较小的三角函数即为小边对着的角,这边的考点主要是约分,我们可以除以一个最大的公约数,
这边我们可以直接用一个自带的函数__gcd,注意前面有下划线,因为这个函数我们平常不经常使用,打上下划线,多数情况是不与用户自己定义的函数名有冲突。
参考MFC / C++ 中为何有的函数名前有下划线?_百度知道
#include <iostream>
#include <algorithm>
using namespace std;
int gcd(int a, int b)
{
int r = 0;
while(r = a%b)
{
a = b;
b = r;
}
return b;
}
int main()
{
int arr[3] = {0};
cin >> arr[0] >> arr[1] >> arr[2];
sort(arr, arr+3);
int x = gcd(arr[0], arr[2]);
cout << arr[0]/x << '/' << arr[2]/x;
return 0;
}
或者咱们自己写一个自定义函数。
P1046 [NOIP2005 普及组] 陶陶摘苹果
#include <iostream>
using namespace std;
int main()
{
int arr[10] = {0};
int i = 0;
for(i=0; i<10; i++)
{
cin >> arr[i];
}
int height = 0;
int count = 0;
cin >> height;
for(i=0; i<10; i++)
{
if(arr[i] <= height+30)
{
count++;
}
}
cout << count;
return 0;
}
注意不要忘了小板凳的高度哦~
#include <iostream>
using namespace std;
int main()
{
int arr[10] = {0};
int i = 0;
for(i=0; i<10; i++)
{
cin >> arr[i];
}
int height = 0;
int count = 0;
cin >> height;
height += 30;
for(i=0; i<10; i++)
{
count += height>=arr[i];
}
cout << count;
return 0;
}
我们也可以进行优化,让寄存器每次少做height+=30这步操作,毕竟个数是+1或+0。
P5717 【深基3.习8】三角形分类
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[4] = { 0 };
cin >> a[1] >> a[2] >> a[3];
sort(a + 1, a + 4);
if (a[1] + a[2] <= a[3])
{
cout << "Not triangle" << endl;
return 0;
}
if (a[1] * a[1] + a[2] * a[2] == a[3] * a[3])
{
cout << "Right triangle" << endl;
}
if (a[1] * a[1] + a[2] * a[2] > a[3] * a[3])
{
cout << "Acute triangle" << endl;
}
if (a[1] * a[1] + a[2] * a[2] < a[3] * a[3])
{
cout << "Obtuse triangle" << endl;
}
if (a[1] == a[2] || a[2] == a[3] || a[1] == a[3])
{
cout << "Isosceles triangle" << endl;
}
if (a[1] == a[2] && a[2] == a[3])
{
cout << "Equilateral triangle" << endl;
}
return 0;
}
这题我们先要知道哪两条是直角边,和第一个不是三角形,则两直角边<=斜边,并且直接返回0,因为它连三角形都不是。
P4414 [COCI2006-2007#2] ABC
#include <iostream>
using namespace std;
int main()
{
int a = 0, b = 0, c = 0;
scanf("%d %d %d", &a, &b, &c);
if(a > b)
{
swap(a, b);
}
if(a > c)
{
swap(a, c);
}
if(b > c)
{
swap(b, c);
}
char arr[4] = {0};
scanf(" %s", arr);
int i = 0;
for(i=0; arr[i]; i++)
{
if(arr[i] == 'A')
{
cout << a << ' ';
}
else if(arr[i] == 'B')
{
cout << b << ' ';
}
else if(arr[i] == 'C')
{
cout << c << ' ';
}
}
return 0;
}
我的繁琐方法,注意当输入三个数字敲回车后,回车是个字符,它就存在了缓冲区冲,等下一个输入,所以得在scanf(“ %s”,..),注意%s前有个空格,它可以把不可显示字符吃掉~
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[3] = {0};
cin >> a[0] >> a[1] >> a[2];
sort(a, a+3);
char A = 0, B = 0, C = 0;
cin >> A >> B >> C;
cout << a[A-'A'] << ' ' << a[B-'A'] << ' ' << a[C-'A'];
return 0;
}
或者这样,cin会直接取缓冲区中的内容,所以不用考虑回车。
而-‘A’时下标为0, 1 , 2,正好对应。