/*
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,
不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址1.0.0.0~126.255.255.255;
B类地址128.0.0.0~191.255.255.255;
C类地址192.0.0.0~223.255.255.255;
D类地址224.0.0.0~239.255.255.255;
E类地址240.0.0.0~255.255.255.255
私网IP范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子网掩码为前面是连续的1,然后全是0
输入:
多行字符串。每行一个IP地址和掩码,已~隔开。如:
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0
输出:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,
之间以空格隔开,根据上面的IP,可以得到:
1.0.0.1~255.0.0.0 ----A类
192.168.0.2~255.255.255.0 ----C类,私有
10.70.44.68~255.254.255.0----错误的掩码
19..0.~255.255.255.0-----错误的IP
可以得到统计数据如下:
1 0 1 0 0 2 1
样例输入:
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0
样例输出: 1 0 1 0 0 2 1
*/
解题思路
这题只能多用几个if else 判断
代码
#include"iostream"
#include"stdio.h"
using namespace std;
// 其实题目没有考虑127.这一系列的ip地址
int main()
{
int A=0,B=0,C=0,D=0,E=0,errorip=0,privateip=0;
char ipadd[40]="";
char ip[20]="";
char ipy[20]="";
int iptem[4];
int ipytem[4];
while(cin>>ipadd) {
sscanf(ipadd,"%[^~]~%s",ip,ipy);
sscanf_s(ip,"%d.%d.%d.%d",&iptem[0],&iptem[1],&iptem[2],&iptem[3]);
sscanf_s(ipy,"%d.%d.%d.%d",&ipytem[0],&ipytem[1],&ipytem[2],&ipytem[3]);
if( iptem[0]<0||iptem[0]>255||
iptem[1]<0||iptem[1]>255||
iptem[2]<0||iptem[2]>255||
iptem[3]<0||iptem[3]>255||
ipytem[0]<0||ipytem[0]>255||
ipytem[1]<0||ipytem[1]>255||
ipytem[2]<0||ipytem[2]>255||
ipytem[3]<0||ipytem[3]>255) {
errorip++;
continue;
}
if(iptem[0]<=126 && ipytem[0]==255 &&
ipytem[1]==0 && ipytem[2]==0 && ipytem[3]==0) {
A++;
if(iptem[0]==10) {
privateip++;
}
continue;
}
if( iptem[0]<=191&&iptem[0]>=128&&
iptem[0]>127&&ipytem[0]==255&&
ipytem[1]==255&&ipytem[2]==0&&ipytem[3]==0) {
B++;
if(iptem[0]==172&&iptem[1]>=16&&iptem[1]<=31)
privateip++;
continue;
}
if( iptem[0]<=223&&iptem[0]>191&&
ipytem[0]==255&&ipytem[1]==255&&
ipytem[2]==255&&ipytem[3]==0) {
C++;
if(iptem[0]==192&&iptem[1]==168)
privateip++;
continue;
}
if( iptem[0]<=239&&iptem[0]>=224&&
ipytem[0]==255&&ipytem[1]==255&&
ipytem[2]==255&&ipytem[3]==255) {
D++;
continue;
}
if(iptem[0]>=240&&ipytem[0]==255&&
ipytem[1]==255&&ipytem[2]==255&&ipytem[3]==255) {
E++;
continue;
} else {
errorip++;
}
}
cout<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<" "<<errorip<<" "<<privateip<<endl;
}
/*
题目描述
临近开学了,小C才想起来数学老师布置了暑假作业。暑假作业是很多张试卷,
每张试卷所需的时间和获取的价值已知,请你帮他安排一下,
用他仅剩的一点时间来做最有价值的作业。
接口说明
原型:
int GetMaxValue(int nPapers, int nRemain, int paper[][2], double* pMaxValue)
输入参数:
int nPapers:试卷的数目(1≤Papers≤20)
int nRemain:表示剩余的时间(1≤nRemain≤10000)
int paper[][2]:nPapers*2的数组,每一行的两个元素依次为做完这一份试卷所需的时间、
做完这份试卷获取的价值。如果剩余时间不够做完一份卷子,可根据剩余时间获得卷子的部分价值。
输出参数:
double * pMaxValue:获得的最大价值
返回值:
0:异常,1:成功
*/
解题思路
本题是求解在一定的时间内获得最大价值,那么我们需要获得价值和时间比值,比值越大,
int GetMaxValue(int nPapers, int nRemain, int paper[][2], double* pMaxValue)
{
if (nPapers<0 || nPapers>200 ||
nRemain<0 || nRemain>10000) {
return 0;
}
*pMaxValue=0;
int i,index,timesum=0,timesumMax=0;
double temp[20]={0};
for (i=0;i<nPapers;i++) {
temp[i]=(double)paper[i][1]/(double)paper[i][0]; /*收益和时间比值*/
timesumMax+=paper[i][0]; //总的时间
}
do
{
/*每一次循环找出最大的收益值*/
double f=0;
for (i=0;i<nPapers;i++) {
if (f < temp[i]) {
f=temp[i];/*最大收益*/
index=i;
}
}
temp[index]=0; /*该位置数赋值为0,不参与下一次比较*/
timesum+=paper[index][0];
if (timesum < nRemain) {
*pMaxValue+=paper[index][1];
}
else {
/*成比例算出获得的价值*/
double t=(double)paper[index][1]*(nRemain-(timesum-paper[index][0]) \
)/(double)paper[index][0];
*pMaxValue+=t;
}
}while (timesum<nRemain && timesum<timesumMax);
return 1;
}
/*
简要描述
字符替换,按照替换规则,将输入的字符串做转换;其它字符不作处理。
详细描述:
题目背景
字母的替换规则,如下所示,A被E替换,B被C替换,依次类推。
0 1 2 3 4 5 6 7 8 9 10
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
E C F A J K L B D G H I V W Z Y M N O P Q R S T U X
a b c d e f g h i j k l m n o p q r s t u v w x y z
e r w q t y g h b n u i o p s j k d l f a z x c v m
*/
方法一
char* CharReplace(char* pSourceChar) { char* pResultChar = "Different meaning"; char bighsm[26]; char littlehsm[26]; int i = 0,j=0; int pSourceCharLen = 0; bighsm[0]='E'; bighsm[1]='C'; bighsm[2]='F'; bighsm[3]='A'; bighsm[4]='J'; bighsm[5]='K'; bighsm[6]='L'; bighsm[7]='B'; bighsm[8]='D'; bighsm[9]='G'; bighsm[10]='H'; bighsm[11]='I'; bighsm[12]='V'; bighsm[13]='W'; bighsm[14]='Z'; bighsm[15]='Y'; bighsm[16]='M'; bighsm[17]='N'; bighsm[18]='O'; bighsm[19]='P'; bighsm[20]='Q'; bighsm[21]='R'; bighsm[22]='S'; bighsm[23]='T'; bighsm[24]='U'; bighsm[25]='x'; littlehsm[0]='e'; littlehsm[1]='r'; littlehsm[2]='w'; littlehsm[3]='q'; littlehsm[4]='t'; littlehsm[5]='y'; littlehsm[6]='g'; littlehsm[7]='h'; littlehsm[8]='b'; littlehsm[9]='n'; littlehsm[10]='u'; littlehsm[11]='i'; littlehsm[12]='o'; littlehsm[13]='p'; littlehsm[14]='s'; littlehsm[15]='j'; littlehsm[16]='k'; littlehsm[17]='d'; littlehsm[18]='l'; littlehsm[19]='f'; littlehsm[20]='a'; littlehsm[21]='z'; littlehsm[22]='x'; littlehsm[23]='c'; littlehsm[24]='v'; littlehsm[25]='m'; for(i=0;i<pSourceCharLen;i++,j++) { if(pSourceChar[i]>='a'&&pSourceChar[i]<='z') pResultChar[j] = littlehsm[pSourceChar[i]-'a']; else if(pSourceChar[i]>='A'&&pSourceChar[i]<='Z') pResultChar[j] = bighsm[pSourceChar[i]-'a']; else pResultChar[j] = pSourceChar[i]; } pResultChar[j] = '\0'; return pResultChar; }
优化之后
char* CharReplace(char* pSourceChar)
{
if(!pSourceChar||pSourceChar[0]=='\0')
return 0;
int temp;
char source[]="ECFAJKLBDGHIVWZYMNOPQRSTUX";
char source1[]="erwqtyghbnuiopsjkdlfazxcvm";
int i = 0;
for(i=0;pSourceChar[i]!='\0';i++) {
if(pSourceChar[i]>='A'&&pSourceChar[i]<='Z') {
temp=(pSourceChar[i]-'A');
pSourceChar[i]=source[temp];
}
else if(pSourceChar[i]>='a'&&pSourceChar[i]<='z') {
temp=(pSourceChar[i]-'a');
pSourceChar[i]=source1[temp];
}
}
pSourceChar[i]='\0';
return pSourceChar;
}
描述: 题目描述
赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为“战国时期”。在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都。 赛马是当时最受齐国贵族欢迎的娱乐项目。上至国王,下到大臣,常常以赛马取乐,并以重金赌输赢。田忌多次与国王及其他大臣赌输赢,屡赌屡输。一天他赛马又输了,回家后闷闷不乐。孙膑安慰他说:“下次有机会带我到马场看看,也许我能帮你。” 孙膑仔细观察后发现,田忌的马和其他人的马相差并不远,只是策略运用不当,以致失败。 比赛前田忌按照孙膑的主意,用上等马鞍将下等马装饰起来,冒充上等马,与齐王的上等马比赛。第二场比赛,还是按照孙膑的安排,田忌用自己的上等马与国王的中等马比赛,在一片喝彩中,只见田忌的马竟然冲到齐王的马前面,赢了第二场。关键的第三场,田忌的中等马和国王的下等马比赛,田忌的马又一次冲到国王的马前面,结果二比一,田忌赢了国王。 就是这么简单,现在渊子也来赛一赛马。假设每匹马都有恒定的速度,所以速度大的马一定比速度小的马先到终点(没有意外!!)。不允许出现平局。最后谁赢的场数多于一半(不包括一半),谁就是赢家(可能没有赢家)。渊子有N(1≤N≤1000)匹马参加比赛。对手的马的数量与渊子马的数量一样,并且知道所有的马的速度。聪明的你来预测一下这场世纪之战的结果,看看渊子能否赢得比赛。
输入
输入有多组测试数据。 每组测试数据包括3行: 第一行输入N(1≤N≤1000)。表示马的数量。 第二行有N个整型数字,即渊子的N匹马的速度。 第三行有N个整型数字,即对手的N匹马的速度。 当N为0时退出。
输出
若通过聪明的你精心安排,如果渊子能赢得比赛,那么输出“YES”。 否则输出“NO”。
样例输入
5
2 3 3 4 5
1 2 3 4 5
4
2 2 1 2
2 2 3 1
0
样例输出
YES
NO
接口说明
原型:
char * IsYuanziWin(unsigned int num, unsigned int * speed_yz, unsigned int * speed_op)
功能:
判断yuanzi 的马是否会赢?yuanzi 的马赢了,返回 YES. 否则返回 NO
输入参数:
unsigned int num: 赛马的数量; (1<= num <=1000)
unsigned int * speed_yz: yuanzi 的马的速度;
unsigned int * speed_op: 对手的马的速度;
输出参数:
无
返回值:
char * 型 的字符串,yuanzi 的马赢了,返回 YES. 否则返回 NO;
练习阶段: 中级
思路
用一半多一个的上等马与对手的下等马比较
用的是笨方法,先将双方的马进行从低到高的排序,逐一比较,并且记录当前yuanzi竞争对手马位置。
#include "OJ.h"
#include "string.h"
#include "stdio.h"
/* 功能:判断yuanzi 的马是否会赢?yuanzi 的马赢了,返回 YES. 否则返回 NO 输入参数: unsigned int num: 赛马的数量; (1<= num <=1000) unsigned int * speed_yz: yuanzi 的马的速度; unsigned int * speed_op: 对手的马的速度; 输出参数: 无 返回值: char * 型 的字符串,yuanzi 的马赢了,返回 YES. 否则返回 NO; */
void sort(unsigned int *a,int n)
{
int i,j;
unsigned int num;
for (i=0;i<n;i++)
for (j=0;j<n-i;j++) {
if (a[j]>a[j+1]) { //大的后面
num=a[j];
a[j]=a[j+1];
a[j+1]=num;
}
}
}
char * IsYuanziWin(unsigned int num, unsigned int * speed_yz,
unsigned int * speed_op)
{
if(!speed_yz||!speed_op)
return (char *)NULL;
if(num <=0 ) {
return (char *)NULL;
}
/*1.先排序*/
sort(speed_yz,num);
sort(speed_op,num);
int count=0;
int j,start=0;
for(int i=0;i<num;i++) {
for(j=start;j<num;j++) {
if(speed_yz[i]>speed_op[j]) {
count++;
start=j+1;
break;
}
}
}
if(count>num/2)
return "YES";
else
return "NO";
}