牛客小白月赛22

2023-01-08,

累乘数字

题目描述

我们知道将一个大于1的数乘以另一个大于1的数会使乘积大于任意一个乘数。
现在给出两个数字 n, d,你能否计算将n乘以d次100的结果。

输入描述:

多组输入
每组输入在一行中给出 n,d,1≤n,d≤100

输出描述:

每组输入输出一行代表答案。

示例1

输入

5 1
11 1
85 2

输出

500
1100
850000

描述:签到题,用循环输出一下就可以,千万别把结果算出来存在变量里再输出,因为结果数值太大了

/*
 * @Issue: 链接:https://ac.nowcoder.com/acm/contest/4462/F 
 * @Author: 一届书生
 * @LastEditTime: 2020-02-22 21:09:21
 */
#include<iostream>
#include<math.h>
using namespace std;
#define ll long long
int main(){
    ll n,d;
    while(cin>>n>>d){
        cout<<n;
        for(int i=0;i<2*d;i++)
        cout<<0;        //输出字符型的‘0‘好像会出错
        cout<<endl;
    }
    return 0;
}    

 

方块涂色

题目描述

一块矩形区域被划分为了n行m列的小方格,初始情况下这些方格都是未被上色的。
为了使得矩形看起来不是单一的色彩,现在挑选出r行c列格子并将挑选出的格子上色。
请计算上色完成后,未上色格子的数目。

输入描述:

多组输入
每组输入在一行中给出四个数字 n, m, r, c,含义如题所示。
数据保证有 1≤n,m≤10^6,1≤r≤n,1≤c≤m

输出描述:

每组输入输出一行代表答案。

示例1

输入

5 5 2 3

输出

6

说明

示例2

输入

3 2 2 1
2 4 2 4

输出

1
0

描述:这完全是个思维题目,想明白了,读懂题目就不难了,一行代码搞定,实例1中两行三列,完全可以这样涂,这样好理解,然后公式就出来了,看代码。

 

 

/*
 * @Issue: 链接:https://ac.nowcoder.com/acm/contest/4462/E
 * @Author: 一届书生
 * @LastEditTime: 2020-02-22 21:16:00
 */
#include<iostream>
#include<math.h>
using namespace std;
#define ll long long
int main(){
    ll n,m,r,c;
    while(cin>>n>>m>>r>>c){
        cout<<n*m-r*m-c*n+r*c<<endl;    //only一行代码
    }
    return 0;
}

 

计算A+B

题目描述

在一行中给出一个字符串,请判断是否满足A + B格式,如果满足,输出计算结果,否则输出"skipped"。
此处A,B均为大于等于0的整数,不保证数据没有前导零。

输入描述:

第一行输入一个n,1≤n≤1000,n代表测试数据的组数。

接下来n行,每行输入一个长度不超过10000的字符串。

输出描述:

对于每组输入,输出结果

示例1

输入

4
2+2
1+2
+12
0+0

输出

4
3
skipped
0

描述:这个就有点难度了,主要是结果数值过大,不能用long long来存储,需要用数组来模拟

/*
 * @Issue: https://ac.nowcoder.com/acm/contest/4462/J
 * @Author: 一届书生
 * @LastEditTime: 2020-02-23 11:51:21
 */
#include<iostream>
#include<string>
using namespace std;

int result[1000];   //存答案

void solve(){
    string s;
    cin>>s;
    int len=s.length();
    // 判断字符串中是否没有加号或者多个加号
        int num=0,loc=0; //num代表字符串中'+'个数,loc代表'+'位置
        for(int i=0;i<s.length()-1;i++){
            if(s[i]=='+')num++,loc=i;
        }
        if(num!=1){
            puts("skipped");
        }
    // 判断字符串中加号是否在开头或者结尾

        else if(s[0]=='+'||s[s.length()-1]=='+')
            puts("skipped");
    // 格式正确
        else{
            int former=loc-1,later=len-1,a,b,cnt=0,last=0; 
                //former记录前者遍历,later记录后者

            // 去除前导零
            int fo=0,lat=loc+1;
            while(s[fo]=='0')fo++;
            while(s[lat]=='0')lat++;
            if(fo>former&&lat>later){
                puts("0");
                return;
            }

        
            while(former>=fo||later>=lat){
                a=b=0;
                if(former>=fo) a=s[former]-'0';
                if(later>=lat) b=s[later]-'0';
                result[cnt++]=(a+b+last)%10;        //倒序记录答案
                last=(a+b+last>9); //进位
                former--;later--;
            }
        
            if(last)cout<<last;     //不要忘了最后一个进位
            for(int i=cnt-1;i>=0;i--)
                cout<<result[i];
            cout<<endl;
        }

}
int main(){
    int n;
    cin>>n;
    while(n--)
       solve(); 
    return 0;
}