OJ算法可运行③

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;
}

上一篇

下一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磊磊cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值