L1-046
这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由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)。输出格式:
在一行中输出相应的最小的
s
和n
,其间以1个空格分隔。输入样例:
31
输出样例:
3584229390681 15
cpp
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
int x;
cin>>x;
int s=1,cnt=1;//最小的值,位数
//先找出一个比x稍小的值
while(s<x){
s=s*10+1;
cnt++;
}
//先输出s/x的整数部分,不够添1
while(1){
cout<<s/x;
if(s%x==0) break;//结束的标志
s=(s%x)*10+1;
cnt++;
}
cout<<" "<<cnt;
return 0;
}
L1-047 装睡
你永远叫不醒一个装睡的人 ------ 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。
输入格式:
输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。
输出格式:
按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。
输入样例:
4 Amy 15 70 Tom 14 60 Joe 18 50 Zoe 21 71
输出样例:
Tom Zoe
cpp
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
char s[5];
int huxi ,maibo;
cin>>s>>huxi>>maibo;
if(huxi>20||huxi<15||maibo<50||maibo>70)
cout<<s<<endl;
}
return 0;
}
L1-048 矩阵A乘以B【这个矩阵有一丢丢难,主要是相乘那个地方】
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra行、Ca列,B有Rb行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。
输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。
输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出
Error: Ca != Rb
,其中Ca
是A的列数,Rb
是B的行数。输入样例1:
2 3 1 2 3 4 5 6 3 4 7 8 9 0 -1 -2 -3 -4 5 6 7 8
输出样例1:
2 4 20 22 24 16 53 58 63 28
输入样例2:
3 2 38 26 43 -5 0 17 3 2 -11 57 99 68 81 72
输出样例2:
Error: 2 != 3
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int ra,ca,rb,cb;
int m,n;
cin>>ra>>ca;
int arr1[ra][ca];
for(int i=0;i<ra;i++){
for(int j=0;j<ca;j++){
cin>>arr1[i][j];
}
}
cin>>rb>>cb;
int arr2[rb][cb];
for(int i=0;i<rb;i++){
for(int j=0;j<cb;j++){
cin>>arr2[i][j];
}
}
int arr3[ca][rb];
if(ca!=rb||ca<0||ra<0||cb<0||rb<0){//必须保证大于0
printf("Error: %d != %d",ca,rb);
}
else{
cout<<ra<<" "<<cb<<endl;
for(int i=0;i<ra;i++){
for(int j=0;j<cb;j++){
int sum=0;
for(int k=0;k<ca;k++){
m=arr1[i][k];
n=arr2[k][j];
sum+=m*n;
}
if(j!=0)cout<<" ";
arr3[i][j]=sum;
// cout<<arr3[i][j]<<" ";//坑点,不能直接这样输出空格
cout<<arr3[i][j];
}
//以题目中的样例说一下。
//c11= a11*b11 + a12*b21 + a13*b31;
//c12= a11*b12 + a12*b22 + a13*b32;
//c13= a11*b13 + a12*b23 + a13*b33;
//c14= a11*b14 + a12*b24 + a13*b34;
//c21= a21*b11 + a22*b12 + a23*b13;
//c22= a21*b12 + a22*b22 + a23*b23;
//c23= a21*b13 + a22*b23 + a23*b33;
//c24= a21*b14 + a22*b24 + a23*b34;
//c的行对应a的行,c的列对应b的列
//a的行与b的列相等(这点很重要,看懂了就so easy)。
//比如说c12,a的行始终是1,b的列始终是2。
cout<<endl;
}
}
return 0;
}
L1-049 天梯赛座位分配【这一题我还不会思密达,先在网上搜一下答案给你们哈】【原谅博主】【等我写出来了,我再改代码】
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员...... 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。
输入格式:
输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。
输出格式:
从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按"#X"输出该校的编号X,从 1 开始。
输入样例:
3 3 4 2
输出样例:
#1 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 63 65 67 69 71 73 75 77 79 #2 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 #3 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60
cpp
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int num[101] = { 0 };
int i = 0;
int max = 0;
int id = 0;
int pos[101][11][11] = { 0 };
int pre = 0;
//输入各高校队伍数并求出最大的队伍数
for (i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
max = num[i] > max ? num[i] : max;
}
//编号
int j = 0;
for (j = 1; j <= max; j++)
{
int k = 0;
for (k = 1; k <= 10; k++)
{
for (i = 1; i <= n; i++)
{
if (j <= num[i])
{
//同一个学校隔位坐
if (pre == i)
{
id += 2;
}
else
{
//不同学校正常坐
id += 1;
}
pre = i;
pos[i][j][k] = id;
}
}
}
}
//打印编号信息
for (i = 1; i <= n; i++)
{
printf("#%d\n", i);
for (j = 1; j <= num[i]; j++)
{
int k = 0;
for (k = 1; k <= 10; k++)
{
if (k != 10)
{
printf("%d ", pos[i][j][k]);
}
else
{
printf("%d\n", pos[i][j][k]);
}
}
}
}
return 0;
}
L1-050 倒数第N个字符串【这一题博主也还没搞明白】
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。
输入格式:
输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤105)。
输出格式:
在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。
输入样例:
3 7417
输出样例:
pat
cpp
#include<stdio.h>
#include<math.h>
int main(){
int l,n,t;
scanf("%d%d",&l,&n);
int xx[l],i;
t = pow(26,l)-n; //pow(a,b)是标准库里一个数学函数,求的是a的b次方,头文件为 #include<math.h>
for(i=0;i<l;i++){
xx[i]=t%26; //用创建的数组保存第 i 个位置上对26取得的余数;
t/=26;
}
for(i=l-1;i>=0;i--)
printf("%c",'a'+xx[i]); //a 的ASCII码加上余数,就得到对应字母的ASCII码,不懂的可以取了解一下ASCII
return 0;
}