L1-043 阅览室与L1-046 整除光棍

L1-043 阅览室 (20 分)

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

输入格式:

输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值SE发生时间hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

输出格式:

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

输入样例:

3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00

输出样例:

2 196
0 0
1 60

最开始想的是用数组来存储时间、编号和状态的关系,后来看题的时候发现键值,突然想到map,发现突然思路清晰了起来,不想之前用很多数组很晕

#include<iostream>
#include<map>

using namespace std;

int n;
int main(){
    cin>>n;
    map<int,char> mark;//标记
    map<int,int> record_time;//记录开始时间
    while(n--)
    {
        double time_num = 0;
        int num = 0;//人数
        int a,h,s;
        char state;
        mark.clear();
        record_time.clear();
        while( scanf("%d %c %d:%d",&a,&state,&h,&s) )
        {
            if(a == 0) break;
            if(state == 'S')//借书
            {
                mark[a] = 'S';
                record_time[a] = h * 60 + s;
            }
            if(state == 'E')//还书
            {
                if(mark[a] == 'S')
                {
                    time_num += h * 60 + s - record_time[a];
                    num++;
                    mark[a] = '0';//还原
                }
            }
        }
        if(num != 0)//今天有人借书和还书
            time_num = time_num/num;
        int t=time_num + 0.5;//这波操作十分精髓堪称神来之笔
        cout << num <<" " << t <<endl;
        
    }
    
}

atoll()函数cstdlib标头的库函数。 它用于将给定的字符串值转换为整数值。 它接受包含整数(整数)的字符串,并返回其long long long整数值。

c_str()

//标准库的string类提供了三个成员函数来从一个string得到c类型的字符数组
//主要介绍c_str
//c_str():生成一个const char*指针,指向以空字符终止的数组。
//这个数组应该是string类内部的数组
#include <iostream>
//需要包含cstring的字符串
#include <cstring>
using namespace std;
 
int main()
{
	//更好的方法是将string数组中的内容复制出来 所以会用到strcpy()这个函数
	char *c = new char[20];
	string s = "1234";
	// c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
	strcpy(c,s.c_str());
	cout<<c<<endl;
	s = "abcd";
	cout<<c<<endl;

img

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
 
int main() {
    string s="1";
    int n;
    cin>>n;
    if(n%5==0&&n%2==0) return 0;
    
    for(int i=0;;i++) {
    	
    	if(atoll(s.c_str())%n==0) {
    		cout<<atoll(s.c_str())/n<<" ";
    		break;
		}
    	s=s+"1";
	}
	cout<<s.length();
	return 0;
}

L1-046 整除光棍 (20 分)

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

31

输出样例:

3584229390681 15

说真的,看到这一题,以来直接暴力,后面发现直接暴毙,位数太大了,真心手足无措,一点办法也没有,直到在acwing做了一道模拟竖式的题后发现,蒸滴c!原理如下图:

在这里插å¥å›¾ç‰‡æè¿°

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;

int n;
char ans[1010];

int main()
{
    cin>>n;
    int p = 0;
    int now = 1;
    for (int len = 1; ; ++len)
    {
        if(p || now / n) 
        {
            ans[p] = now / n +'0';
            p ++;
        }
//         cout << now <<" ";
        now %= n;
        if (now == 0)
        {
            ans[p] = 0;
            printf("%s %d\n", ans, len);
            break;
        }
        now = now * 10 + 1;//每次向最后加一位
   }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值