OJ算法题共10个篇幅,不定期在篇幅里增加题目(篇幅不增加)。
个人水平有限,如有错误和可以改进的地方,非常期待批评指正,谢谢!
小数回文
题目描述
我相信大家知道什么叫回文数。
现在给你一个浮点数,请你判断其整数部分和小数部分是否回文。
例如32.23就是一个浮点回文数。3.223就不是。
输入
输入多组数据。
每组数据只有一行,为一个浮点n(n>0且n<100000)。
输出
每组数据输出一行为"Yes"或"No"。(没引号)
输入样例
32.23
3.223
输出样例
Yes
No
Hint
保证用double可以做
输入最多到小数点后五位,且末尾不为0.
精度设置:double eps=1e-6;
#include<cstdio>
#include<iostream>
using namespace std; /*标准开头*/
#define eps 1e-6 //精度设置
bool judge(double x){
x += eps;
long long t;
t = 100000 * x;
if((int(x)) % 10 != (int(10 * x)) % 10) return false;
if((int(x / 10)) % 10 != (int(100 * x)) % 10) return false;
if((int(x / 100)) % 10 != (int(1000 * x)) % 10) return false;
if((int(x / 1000)) % 10 != (int(10000 * x)) % 10) return false;
if((int(x / 10000)) % 10 != t % 10) return false; /*10位整数超过int范围*/
return true;
}
int main(){
double x;
while((scanf("%lf",&x)) != EOF){
if(judge(x)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
题目描述
有一天天臧散人Arthur到了渝州东南的仙剑客栈,发现李逍遥这小子粗心大意在上酒的时候,有的桌上多上了酒,有的桌上没上酒。唉,谁让Arthur心软呢,不忍心看李逍遥被他婶婶骂,决定帮他——收拾一排桌子。
给 你一个数n表示有多少个桌子,接下来给你一段整数序列表示每个桌上需要的酒量(假设这些桌子在一条直线上,且每个桌子之间的距离都是1),正数表示多放了 几瓶酒,负数表示应该放多少瓶酒。请你帮Arthur算一下他提着酒走的最短路程是多少。对了,Arthur体力太渣,一次只能拿一瓶酒。
输入
第一行一个数T表示有T组数据。
接下来T组数据,每组数据有2行。
第一行一个数n(1<=n<=1000),表示桌子数量,
接下来第二行有一段数列Ai(|Ai|<=1000),表示每个桌子上应该放的酒。保证数列总和为0
输出
对于每组测试数据,输出一个数,表示Arthur拿着酒走的最少总路程。
输入样例
2
3
-1 2 -1
6
-1 -1 -1 3 -1 1
输出样例
2
7
Hint
其实就是每瓶酒走的路程之和。
#include<cmath>
#include<iostream>
using namespace std;
int main(){
int T,n,a;
cin >> T;
while(T--){
cin >> n;
int dis = 0,count = 0;
while(n--){
cin >> a;
dis += abs(count);
count += a;
}
cout << dis << endl;
}
}
题目描述
给你一个公式f(n,m)=(3!!+5!!+……+(2n+1)!!)-(2!!+4!!+……+(2m)!!),求公式的值。结果对10007取模。
输入
输入多组数据。
每组数据只有一行,为两个正整数n和m(1<=n,m<=100)。
输出
输出公式的结果。
输入样例
1 1
输出样例
1
Hint
!!表示双阶乘。(2n)!!=246……(2n)。(2n+1)!!=135……(2*n+1)。 取模运算时尽可能边加边取模,边乘边取模。
注意当一个数为负数时,应该使用ans=((ans-sum)%mod+mod)%mod;的形式来将取模的值变为正数
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int m, n;
long long a1,a2,b1,b2,ans;
while (~scanf("%d%d", &n, &m)){
a1 = 1;
a2 = 1;
b1 = 0;
b2 = 0;
for (int i = 1; i <= n; i++){
a1 = a1*(2 * i + 1);
a1 = a1 % 10007;
b1 = b1 + a1;
b1 = b1 % 10007;
}
for (int i = 1; i <= m; i++){
a2 = a2*(2 * i);
a2 = a2 % 10007;
b2 = b2 + a2;
b2 = b2 % 10007;
}
ans = b1 - b2;
if (b1 < b2){
printf("%d\n", (((ans % 10007) + 10007) % 10007));
}
else
printf("%d\n", ans%10007);
}
return 0;
}
LastDay要去西安了。
但是LastDay的狗狗被禁止带上火车。
为了防止饿出狗命来,LastDay 机智的准备了一些狗粮 (#)。
作为强迫症,LastDay决定把狗粮摆放的整齐大方。 比如倒三角形。 Last_Day手残不会摆,是时候你上场了。
输入
输入多组数据。
每组数据只有一行,为一个正整数n(n<=30)。
输出
每组数据输出n行,为n层的倒三角形
输入样例
2
3
输出样例
###
#
#####
###
#
#include<stdio.h>
int main(){
int n,m;
while(~(scanf("%d",&n))){
m=2*n-1;
for(int i=0;i<n;i++){
int k=0;
while(k<i){
printf(" ");
k++;
}
for(int j=0;j<m;j++){
printf("#");
}
printf("\n");
m=m-2;
}
}
return 0;
}
网上:
#include<iostream>
using namespace std;
int main()
{
int n;
while (cin>>n)
{
for(int i=n;i>0;i--)
{
for(int j=1;j<=2*n-1;j++)
{
if(j<=n-i||j>=n+i)
{
cout<<" ";
}
else
{
cout<<"#";
}
}
cout<<endl;
}
}
}
题目描述
creeper学妹有一天拿来一个表达式a/bc+d/e/fg*h,然后在纸上一堆数字让Lawliet做,每一组不超过1秒。Lawliet表示瞬间被秒杀了- -#所以推倒creeper学妹的任务只能交给大家来完成了。
输入
多组数据,第一行一个数T,表示有T组数据。(1<T<1000)
接下来T行,每行8个数a,b,c,d,e,f,g,h(0<=a,b,c,d,e,f,g,h<=999999999,b,e,f均不为0)表示一组数据。
保证a/bc、d/e/fg*h与最终结果均为整数且在int范围内。
输出
每组数据输出一行,为最终计算结果。
输入样例
1
6 2 3 9 3 1 6 2
输出样例
45
Hint
此题禁用float和double
GG说long double也不能忍!!!
数据可能比较弱。 整个式子其实就是(a×c)/b+(d×g×h)/(e×f)= =
#include<stdio.h>
int main()
{
int t;
int a,b,c,d,e,f,g,h;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&h);
printf("%d\n",(a*c)/b+((d*g*h)/(e*f)));
}
return 0;
}
题目描述
零崎最近一段时间非常无聊,于是他决定进行一场冒险,然而无聊的人遇到的冒险也非常的无聊,他的冒险刚刚开始就要结束了。 理由也非常的无聊,因为一个无聊的大魔王决定用一个非常有魔(wu)力(liao)的方式毁灭世界。 魔王有三个具有魔(wu)力(liao)的杆,暂时称为ABC,还有n个具有魔(wu)力(liao)的大小全都不同的盘子,这些盘子按照大小顺序放在A杆上,现在魔王要用具有魔(wu)力(liao)的方式移动到C杆,移动的过程中,小的盘子仍然只能摆在大的盘子上面而不能发生错乱,否侧魔王的魔法就会失灵。 然而魔王似乎想找一个无聊的人来替他完成这个魔法,而无聊的零崎也觉得这个事情非常的无聊,干脆就决定还是让你们去做。 零崎也不知道这个无聊的魔王到底有多少个有魔(wu)力(liao)的盘子,所以他说多少个你们就当是多少个吧。
输入
多组数据,每组一个数字n表示魔王的盘子数。
输出
对于每组数据,输出为魔王魔法发动后盘子移动的过程,两组输出之间用空行隔开。
输入样例
1
2
输出样例
A to C
A to B
A to C
B to C
Hint
这个无聊的魔法还有个名字叫做传说中可以毁灭世界的汉诺塔之术。
#include<stdio.h>
void move(int n,char a,char b,char c){
if(n==1)
printf("%c to %c\n",a,c);//当n只有1个的时候直接从a移动到c
else{
move(n-1,a,c,b);//把a的n-1个盘子通过c移动到b
printf("%c to %c\n",a,c);//把a的最后1个盘(最大的盘)移动到c
move(n-1,b,a,c);//吧b上面的n-1个盘通过a移动到c
}
}
int main(){
int n;
while(~scanf("%d",&n)){
move(n,'A','B','C');
}
return 0;
}