13441 - 求小数的某一位(难题,二刷、三刷!)
时间限制 : 1 秒
内存限制 : 128 MB
分数\tfrac {a}{b}ba化为小数后,小数点后第n位的数字是多少?
输入
三个正整数a,b,n,相邻两个数之间用单个空格隔开。0<a<b<100,1≤n≤10000。
输出
一个数字。
样例
输入
1 2 1
输出
5
答案:
#include<iostream>
using namespace std;
int main() {
int a, b, n;
cin >> a >> b >> n;
int k = a;
for (int i = 1; i <= n-1; i++) {
k = k * 10 % b;
}
cout << k * 10 / b << endl;
return 0;
}
分析: 这道题初次上手可能首先你会觉得很简单。可能你的做法就是把这个小数用一个double类型变量来接受。然后乘n次10,最后取这个数的个位即可。恭喜你,和我刚开始的一样。但是答案是错的。你想想
首先、1/3这个小数存在double类型变量中精度只有15位,当你求100位的时候是求不出正确结果的,因为double类型变量的精度只有15位。超过15位的小数是不知道的。
其次、当循环小数循环体大于15位时,这种方法显然是不对的。
正确做法,令
k=a,其中a为分子,求第n为小数数字,循环n-1次,循环做k=k*10%b;自己动手体会这个语句的算法思想,第一次做整体可能完全想不到这种思想。最后一次循环 k*10/b;最后一步也同等重要
是否通过:
13442 - 计算星期几(难题二刷、三刷)
时间限制 : 1 秒
内存限制 : 128 MB
假设今天是星期日,那么过a^bab天之后是星期几?
输入
两个正整数a,b,中间用单个空格隔开。0<a≤100,0<b≤10000。
输出
一个字符串,代表过a^bab天之后是星期几。
其中,Monday是星期一,Tuesday是星期二,Wednesday是星期三,Thursday是星期四,Friday是星期五,Saturday是星期六,Sunday是星期日。
样例
输入
3 2000
输出
Tuesday
答案:
#include<math.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int result=1;
for (int i = 1; i <= b; i++) {
result *= a;
result %= 7;
}
switch (result) {
case 1:
cout << "Monday" << endl;
break;
case 2:
cout << "Tuesday" << endl;
break;
case 3:
cout << "Wednesday" << endl;
break;
case 4:
cout << "Thursday" << endl;
break;
case 5:
cout << "Friday" << endl;
break;
case 6:
cout << "Saturday" << endl;
break;
default:
cout << "Sunday" << endl;
break;
}
return 0;
}
分析:根据输入样例可知,a^b可能会非常非常大,即使是long long类型也存不下。因此想通过先算出a^b这个结果再进行下一步计算是不可能的。得另寻他法,当然我第一次写这个题是没想到,是借鉴别人的代码思想写出来的。其核心是:对下面语句做b次循环。
result=result*a;
result=result%7;
最后result的值是多少就是星期几。这道题和 上面计算小数的第n位数字很像。这几道题应该都是这种思想:
当一个数很大的时候,没有变量可以存放的时候,这时候就要通过这个数的构造进行乘法、取模等运算使得求得的数值保持在一个小的范围内。直到得到结果
是否通过:
13443 - 幂的末尾(建议二刷)
输入
两个正整数a,b。1≤a≤100,1≤b≤10000。
输出
从高位到低位输出幂的末三位数字,中间无分隔符。若幂本身不足三位,在前面补零。
样例
输入
7 2011
输出
743
答案:
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int result = 1;
int ge, shi, bai;
for (int i = 1; i <= b; i++) {
result = result * a % 1000;
ge = result % 10;
shi = result / 10 % 10;
bai = result / 100 % 10;
}
int s = bai * 100 + shi * 10 + ge;
if (s < 10) {
cout <<"00" << s << endl;
}
else if (s >= 10 && s < 100) {
cout << "0"<< s << endl;
}
else {
cout << s << endl;
}
return 0;
}
分析:这道题初次来做是很难的。因为末尾三位也就在1000范围内,超过1000的也就是千位是没意义的。
result = result * a % 1000;//仔细体会这句语句
大家可以用2的n次幂来模仿计算找规律。
是否通过:
13448 - 百钱买百鸡(纯数学问题)
时间限制 : 1 秒
内存限制 : 128 MB
小明有一百块钱, 打算买一百只鸡, 现在公鸡三块钱一只,母鸡二块钱一只, 小鸡一块钱三只.
现在, 请你编一程序, 帮小明计划一下, 怎么样买法, 才能刚好用一百块钱买一百只鸡.
输入
无
输出
输出100元买鸡的各种方案,每个方案分别以一行输出公鸡数、母鸡数与小鸡数,以公鸡数量最大、母鸡次之、小鸡最后的顺序给出每个方案,如下面片段:
25 0 75
20 8 72
...
样例
输入
输出
答案:
#include<iostream>
using namespace std;
int main() {
int i=0, j=0, k=0;//分别表示公鸡、母鸡、小鸡的数目
int count = 0, price = 0, flag = 0;
for (i = 33; i >= 0; i--) {
for (j = 50; j >= 0; j--) {
for (k = 110; k >= 0; k--) {
count = i + j + k;
price = 3 * i + 2 * j + k / 3;
flag = k % 3;
if (count == 100 && price == 100 &&flag == 0) {
cout << i << " " << j << " " << k << endl;
}
}
}
}
return 0;
}
分析:很多人可能没想明白,为什么公鸡的数量小于33,母鸡数量小于等于50,因为100块钱最多只能买32只公鸡,50只母鸡。其实大家还可以自己再优化。这里是纯粹的数学问题简化。
是否通过:
13451 - 危险的实验
时间限制 : 1 秒
内存限制 : 128 MB
小明最近在上化学课,他需要使用到 n 种化学物质来进行他的实验。在做实验的 时候, 他需要将所有化学物质放在桌面上,按次序排成一条直线。
然而每一种化学物质都是危险品,对于第 i 个化学物质,如果有另外一个化学物 质距离它的距离小于 ai,那么就会发生爆炸。
小明想知道如果要安全的完成他的实验,桌子最短可以多短。
输入
第一行一个整数n,表示化学物质的个数。
第二行有n 个整数,第 i 个整数 ai 表示第i 个化学物质必须与其他化学物质保 持的距离。
输出
输出一行,包括一个整数,表示能够让小明安全完成实验的桌子最小长度。注意: 物品要安原来的次序摆放。
样例
输入
3 3 1 2
输出
5
提示
20%的数据,1<=n<=20
50%的数据,1<=n<=100000
100%的数据,1<=n<=1000000,1<=ai<=100000
答案:
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
int final,previous=0;
long long sum = 0;
for (int i = 1; i <= n; i++) {
cin >> final;
if (final > previous && i != 1) {
sum += final;
}
else if(final <= previous && i != 1){
sum += previous;
}
previous = final;
}
cout << sum << endl;
return 0;
}
分析:这道题还是有难度的,我在做这道题的时候,由于第一次做,对题目意思理解不是很清楚。先说说题目的意思。题目的意思是
首先:至少得有两种化学药品。不可能只有一种药品,因此n不可能为1。
其次:就是这个距离的范围,开始没注意题目下边的提示,用int范围内的数据表示距离,发现完全不够,只能过前两个测试点,但是等n很大,而且每个a[i]也很大时,发现距离范围高达50亿,int范围是表示不了的。
最后:就是逻辑了,当输入的当前距离比前一种物品距离小,则加上前一种物品的距离。否则加上当前物品的距离,因此得用一个变量previous来记录前一个物品的距离。
这个题有很多种变形,重要的是理解题目意思和掌握它的逻辑算法。
是否通过: