1013的题目要求是打印素数表,而1014是打印时间,看似没什么关联,其实都是一种程序内部的变量的映射。关键是正确对应。
1013
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例:5 27输出样例:
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103代码如下:
#include <iostream>
using namespace std;
bool isPrimeNumber(int num) //判断是否为质数代码,如果返回true表示是质数,返回false是合数
{
if(num < 2) //为1
return false;
else if(num == 2) //为2
{
return true;
}
else
{
for(int i=2;i*i<=num;i++) //大于2之后,从奇数找起
{
if(num % i == 0) //表示能被整除,所以是合数
return false;
}
return true ; //判断如果都不能被整除,则说明是质数
}
}
int main()
{
int M,N;
int number = 0; //循环计数
int count = 0;
cin >> M >> N ; //输入M到N的数,M表示最小的值,N表示最大的值
while(count < N) //计数是否大于N
{
number ++ ; //计数+1
if(isPrimeNumber(number) == true) //如果为质数,则计数加1
{
count++;
if(count >= M)
{
if((count-M+1) % 10 == 0) //说明需要换行
cout << " " << number << endl;
else if((count-M+1) % 10 == 1) //第一个元素不输出空格
cout << number ;
else
cout << " " << number ;
}
}
}
system("pause");
return 0;
}
这道题目的难点在于整数的编号对应素数的编号,比如2,3对应素数的编号是1,2,最最快捷简单的方法是打印素数表(这种判别素数的方法在以后的算法心得中会写出),但是用素数为判断元素去打印素数表不能直接确定素数的编号。所以我采用了直接判断素数的方式,对于1和2直接判断,而对于大于2的数,直接以遍历的方式进行整除,这里的循环边界条件可以进一步优化,不用直接取平方的形式,而用相乘的形式优化(只要判断所有小于这个数的平方能否被该数整除即可,当然1除外)。最后就是注意输出形式,第一个不输出空格,最后一个换行即可。
1014
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母'D',代表星期四;第2对相同的字符是'E',那是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、以及大写字母A到N表示);后面两字符串第1对相同的英文字母's'出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
输入格式:
输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。
输出格式:
在一行中输出约会的时间,格式为“DAY HH:MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。
输入样例:3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm输出样例:
THU 14:04代码如下
#include <iostream>
#include <string>
using namespace std;
char getData(string &a,string &b,int *p) //传入两个字符串,,传入一个时间返回一个字符
{
int n = 0;
if(a.size()>=b.size()) //如果a的长度大于等于b,用b的长度去比
n = b.size();
else
n = a.size();
for(int i = 0;i<n;i++)
{
if(a[i] == b[i] && a[i] >= 'A' && a[i] <= 'G')
{
*p = i;
return a[i];
}
}
return 0;
}
char getHour(string a,string b,int p) //传入两个字符串,传入一个时间返回一个字符
{
int n = 0;
if(a.size()>=b.size()) //如果a的长度大于等于b,用b的长度去比
n = b.size();
else
n = a.size();
for(int i = p+1;i<n;i++)
{
if(a[i] == b[i])
{
if((a[i] >= 'A' && a[i] <= 'N')||(a[i] >= '0' && a[i] <= '9'))
return a[i];
}
}
return 0;
}
int getMinute(string a,string b) //传入两个字符串,得到实际的分钟数,并返回
{
int n = 0;
if(a.size()>=b.size()) //如果a的长度大于等于b,用b的长度去比
n = b.size();
else
n = a.size();
for(int i = 0;i<n;i++)
{
if(a[i] == b[i])
{
if ((a[i] >= 'a' && a[i] <= 'z')||a[i] >= 'A' && a[i] <= 'Z' )
//if ((a[i] >= 'a' && a[i] <= 'z') )
return i;
}
}
return 0;
}
int main()
{
int count = 0;
string a[4];
string data = "MON";
string timeHour = "00";
int timeMinute = 0;
for(int i=0;i<4;i++)
{
cin >> a[i];
}
char temp = getData(a[0],a[1],&count);
switch(temp) //寻找日期
{
case 'A':data = "MON";break;
case 'B':data = "TUE";break;
case 'C':data = "WED";break;
case 'D':data = "THU";break;
case 'E':data = "FRI";break;
case 'F':data = "SAT";break;
case 'G':data = "SUN";break;
//default:break;
}
char temp1 = getHour(a[0],a[1],count);
timeMinute = getMinute(a[2],a[3]);
cout << data << " " ;
if(temp1<='9'&&temp1>='0')
cout << '0' << temp1 - '0' ;
else
cout << temp1 - 'A' + 10 ;
if(timeMinute < 10)
cout << ":0" << timeMinute <<endl;
else
cout << ":" << timeMinute <<endl;
system("pause");
return 0;
}
这道题目的难点其实就是理解题目的意思,我的解读就是:第1,2个字符串用于得出星期几,和几点;第3,4个字符串用于得出是第几分钟。
得出第几分钟比较简单,但是得出星期几和小时,需要有以下几个逻辑:1.一定从字符串中先得到星期几,然后才能得出几点;2.星期几必须是大写字母'A'到'G';3.几点必须是大写字母'A'到'N'或者是‘0’和‘9’;当明白知道这三个逻辑的时候,程序就引刃而解了。但是我还是没有一下做正确,有两点原因:没有区别星期和小时的顺序;没有正确确定星期的范围。我这里用了一个指针用于记录星期判断的位置,下次遍历小时,用这个位置之后开始遍历。