华为OD机试4.26
今天早上刚刚做完华为OD的笔试题。应该是凉凉;
第一题,喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当数字是7的倍数或者数字本身含有7的话,要喊"过"。现给定一个长度为N的数组,存储了打乱顺序的每个人喊"过"的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊"过"的次数。
我用C++写的代码。但是没有过,请大佬们帮我看看问题
#include <stdio.h> #include <math.h> #include <sstream> #include <iostream> using namespace std; bool isSeven(int num){ if(0==num%7){ return true; } while(0!=num){ if(7==num%10){ return true; } num/=10; } return false; } int main(){ string s; while(1){ getline(cin,s); if(s.empty()){ break; } int n=0;//读取单个数值 int count=0;//喊7次数 int people[10]={0};//存值数组,用于存放每个人喊7的次数。 int member = 0;//一共几个人 istringstream sstrcin(s); while(sstrcin>>n){ count+=n; member++; } //cout<<"member="<<member<<endl; //cout<<"count="<<count<<endl; if(0==count){ cout<<s<<endl; continue; } int num =0; int i=1; while(num<count){ if(true==isSeven(i)){ people[i%member-1]++; //cout<<"people["<<i%member-1<<"]="<<people[i%member-1]<<endl; num++; } i++; } for(int i=0;i<member;i++){ cout<<people[i]<<" "; } cout<<endl; s.clear(); } }
* 创建工号,例如 a1,aa1,aa01
* 根据人数生成工号,求工号中数字最短长度,比如a1,数字最短为1,aa01,数字最短为01,不能全为字母或者全为数字
* x表示人数,y表示字母数
* 输入x(0<x<2^50-1),y(0<y<=5)
* 输入:26 1
* 输出:1
* 输入:260 1
* 输出:1
* 输入:2600 1
* 输出:2
想来想去还是不会做。 求解这个题
第三题
模拟一个连续的内存块,其大小固定为100字节:
- 1.用户输入"REQUEST=10"表示从内存中分配一个连续的大小为10字节的空间,当分配成功时,输出内存区块的首地址,分配失败(内存空间不足)时输出"error"
- 2.用户输入“RELEASE=0”,表示释放首地址为0所对应的区块,如果不存在相应区块,则输出“error”,反之不输出
属实不会做,随便写了写不会做。
#华为OD#- 1.用户输入"REQUEST=10"表示从内存中分配一个连续的大小为10字节的空间,当分配成功时,输出内存区块的首地址,分配失败(内存空间不足)时输出"error"
- 2.用户输入“RELEASE=0”,表示释放首地址为0所对应的区块,如果不存在相应区块,则输出“error”,反之不输出
属实不会做,随便写了写不会做。