编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
输入描述:
输入N个字符,字符在ACSII码范围内。
输出描述:
输出范围在(0~127)字符的个数。
#include <iostream>
#include <string.h>
using namespace std;
int
main()
{
char
c[
500000
];
int
s[
130
]={
0
};
cin>>c;
int
len = strlen(c);
int
count =
0
;
for
(
int
i =
0
; i <len; ++i )
{
if
(c[i]>=
0
&& c[i]<=
127
)
s[c[i]]++;
}
for
(
int
i =
0
; i <
130
; ++i){
if
(s[i] >
0
)
count++;
}
cout<<count<<endl;
return
0
;
}
句子逆序
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符#include <iostream> #include <stack> #include <string> using namespace std; //句子逆序 以空格为单位 //题目要求是 i am a boy boy a am i //对于逆序的用栈最合适 int main(int argc, char* argv[]) { string s; stack<string> sstack; while(cin>>s) { sstack.push(s); } while(sstack.size()!=1) { cout<<sstack.top()<<" "; sstack.pop(); } cout<<sstack.top()<<endl; return 0; }
字串的连接最长路径查找
题目描述
给定n个字符串,请对n个字符串按照字典序排列。输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。#include<iostream>
#include<cstring>
using namespace std;
int
main(){
char
a[
1000
][
1000
];
char
temp[
1000
];
int
n;
cin>>n;
for
(
int
i=
0
;i<n;i++){
cin>>a[i];
}
for
(
int
i=
0
;i<n-
1
;i++){
for
(
int
j=i+
1
;j<n;j++){
if
(strcmp(a[i],a[j])>
0
){
strcpy(temp,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],temp);
}
}
}
for
(
int
i=
0
;i<n;i++){
cout<<a[i]<<endl;
}
}
求int型正整数在内存中存储时1的个数
题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
#include<iostream>
using namespace std;
int
main()
{
int
n;
cin>>n;
int
a[
100000
]={
0
};
int
i=
0
,num=
0
;
while
(n)
{
a[i]=n%
2
;
n/=
2
;
i++;
}
for
(
int
j=
0
;j<i;j++)
{
if
(a[j]==
1
)
num++;
}
cout<<num<<endl;
return
0
;
}
购物单
输入的第 1 行,为两个正整数,用一个空格隔开:N m
(其中 N ( <32000 )表示总钱数, m ( <60 )为希望购买物品的个数。)
从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q
(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~ 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)#include <iostream>
#include <memory.h>
using namespace std;
#define max(a,b) a>b?a:b
int
main()
{
int
N;
int
m;
cin>>N>>m;
int
w[
100
][
3
];
int
v[
100
][
3
];
int
total[
100
][
5000
];
memset(w,
0
, sizeof(w));
memset(v,
0
, sizeof(v));
memset(total,
0
, sizeof(total));
int
_v,_p,_q;
int
num =
1
;
//num为主件的总数
for
(
int
i=
1
;i<=m;i++)
{
cin>>_v>>_p>>_q;
if
(_q ==
0
)
{
w[num][
0
] = _p*_v;
v[num][
0
] = _v/
10
;
num++;
}
else
{
if
(w[_q][
1
]==
0
){
w[_q][
1
] = _v*_p;
v[_q][
1
] = _v/
10
;
}
else
{
w[_q][
2
] = _p*_v;
v[_q][
2
] = _v/
10
;
}
}
}
num-- ;
for
(
int
i=
1
;i<=num;i++){
for
(
int
j=v[i][
0
];j<=N/
10
;j++){
//比较不添加i组物品和添加i组主件
int
tmp = max(total[i-
1
][j], (total[i-
1
][ j-v[i][
0
] ]+w[i][
0
]));
//比较有附件1
if
(v[i][
1
]>
0
&&j-v[i][
0
]-v[i][
1
]>=
0
)
{
tmp = max(tmp, (total[i-
1
][ j-v[i][
0
]-v[i][
1
] ]+v[i][
0
]+w[i][
1
]));
}
//比较有附件2
if
(v[i][
2
]>
0
&&j-v[i][
0
]-v[i][
2
]>=
0
)
{
tmp = max(tmp, (total[i-
1
][ j-v[i][
0
]-v[i][
2
] ]+w[i][
0
]+w[i][
2
]));
}
//比较有附件1和附件2
if
(v[i][
2
]>
0
&&v[i][
1
]>
0
&&j-v[i][
0
]-v[i][
1
]-v[i][
2
]>=
0
)
{
tmp = max(tmp, (total[i-
1
][ j-v[i][
0
]-v[i][
1
]-v[i][
2
] ]+w[i][
0
]+w[i][
1
]+w[i][
2
]));
}
total[i][j] = tmp;
}
}
cout << total[num][N/
10
] << endl;
}
坐标移动
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
A10;S20;W10;D30;X;A1A;B10A11;;A10;#include<iostream>
#include<string.h>
using namespace std;
int
Isright(
char
str[])
{
int
count =
0
;
if
(strlen(str)>
0
&&strlen(str)<=
3
)
count++;
if
(str[
0
]==
'A'
||str[
0
]==
'S'
||str[
0
]==
'D'
||str[
0
]==
'W'
)
count++;
if
((isdigit(str[
1
])&&(strlen(str)==
2
))||((strlen(str)>
2
) && isdigit(str[
2
]) && isdigit(str[
1
])))
count++;
if
(count ==
3
)
return
1
;
else
return
0
;
}
int
main()
{
char
str[
10001
];
char
solve[
1001
][
1001
];
while
(gets(str))
{
int
len = strlen(str);
int
count =
0
;
int
num =
0
;
for
(
int
i =
0
;i<len;i++)
{
if
(str[i]==
';'
)
{
solve[count][num] =
'\0'
;
count++;
num =
0
;
//cout<<";;"<<count<<endl;
}
else
{
//cout<<"zz"<<count<<endl;
solve[count][num++] = str[i];
}
//solve[count][num] = '\0';
//cout<<solve[i]<<endl;
}
int
left =
0
;
int
right =
0
;
for
(
int
i =
0
;i<count;i++)
{
//cout<<solve[i]<<endl;
int
num_temp =
0
;
if
(Isright(solve[i]))
{
//cout<<"s"<<solve[i]<<endl;
switch
(solve[i][
0
])
{
case
'A'
:
{
if
(strlen(solve[i])==
2
)
{
num_temp = solve[i][
1
] -
'0'
;
}
else
{
num_temp = (solve[i][
1
] -
'0'
)*
10
+ solve[i][
2
] -
'0'
;
}
//cout<<num_temp<<endl;
left-=num_temp;
break
;
}
case
'D'
:
{
if
(strlen(solve[i])==
2
)
{
num_temp = solve[i][
1
] -
'0'
;
}
else
{
num_temp = (solve[i][
1
] -
'0'
)*
10
+ solve[i][
2
] -
'0'
;
}
//cout<<num_temp<<endl;
left+=num_temp;
break
;
}
case
'W'
:
{
if
(strlen(solve[i])==
2
)
{
num_temp = solve[i][
1
] -
'0'
;
}
else
{
num_temp = (solve[i][
1
] -
'0'
)*
10
+ solve[i][
2
] -
'0'
;
}
//cout<<num_temp<<endl;
right+=num_temp;
break
;
}
case
'S'
:
{
if
(strlen(solve[i])==
2
)
{
num_temp = solve[i][
1
] -
'0'
;
}
else
{
num_temp = (solve[i][
1
] -
'0'
)*
10
+ solve[i][
2
] -
'0'
;
}
//cout<<num_temp<<endl;
right-=num_temp;
break
;
}
default
:
break
;
}
}
}
cout<<left<<
","
<<right<<endl;
}
}
识别有效的IP地址和掩码并进行分类统计
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有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
简单错误记录
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool valid(
char
* data){
if
(data == NULL)
return
false
;
int
len = strlen(data);
if
(len ==
0
)
return
false
;
for
(
int
i =
0
; i < len; i++){
if
(!(data[i] <=
'9'
&& data[i] >=
'0'
)){
return
false
;
}
}
return
true
;
}
bool checkAndConvert(
char
*ip, unsigned
int
&result){
int
dot =
0
;
for
(
int
i =
0
; i < strlen(ip); i++){
if
(ip[i] ==
'.'
)dot++;
}
if
(dot !=
3
)
return
false
;
char
*data = strtok(ip,
"."
);
if
(!valid(data))
return
false
;
int
tmp =
0
;
result =
0
;
int
count =
0
;
while
(data){
tmp = atoi(data);
if
(tmp >
255
)
return
false
;
result = result *
256
+ tmp ;
count ++;
data = strtok(NULL,
"."
);
}
if
(count !=
4
)
return
false
;
return
true
;
}
int
main()
{
char
input[
100
];
char
ip[
50
];
char
mask[
50
];
int
ans[
10
];
memset(ans,
0
,sizeof(ans));
while
(gets(input))
{
int
idx1 =
0
;
int
idx2 =
0
;
int
flag =
0
;
for
(
int
i =
0
; i < strlen(input); i++){
if
(input[i] ==
'~'
){
ip[idx1] =
'\0'
;
flag =
1
;
}
else
if
(flag ==
0
)ip[idx1++] = input[i];
else
if
(flag ==
1
)mask[idx2++] = input[i];
}
mask[idx2] =
'\0'
;
unsigned
int
ipnum =
0
;
unsigned
int
masknum =
0
;
if
(!checkAndConvert(ip,ipnum) || !checkAndConvert(mask,masknum)){
ans[
5
]++;
continue
;
}
if
(((~masknum +
1
) | masknum) != masknum || masknum ==
0
|| ~masknum ==
0
){
ans[
5
] ++;
continue
;
}
int
head = ipnum >>
24
;
int
next = (ipnum - (head <<
24
)) >>
16
;
if
(head <=
126
&& head >
0
){
ans[
0
]++;
}
else
if
(head <=
191
&& head >=
128
){
ans[
1
]++;
}
else
if
(head <=
223
&& head >=
192
){
ans[
2
]++;
}
else
if
(head <=
239
&& head >=
224
){
ans[
3
]++;
}
else
if
(head <=
255
&& head >=
240
){
ans[
4
]++;
}
if
(head ==
10
){
ans[
6
]++;
}
if
(head ==
172
&& next >=
16
&& next <=
31
){
ans[
6
]++;
}
if
(head ==
192
&& next ==
168
){
ans[
6
]++;
}
}
cout<<ans[
0
];
for
(
int
i=
1
;i<
7
;i++)
cout<<
" "
<<ans[i];
}
题目描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
E:\V1R2\product\fpgadrive.c 1325
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
char
name[
17
];
int
line;
int
num;
}Errorinfo;
int
main()
{
char
buffer[
10240
];
int
count =
0
, hang,i;
Errorinfo record[
10240
];
while
(scanf(
"%s %d"
, buffer, &hang) ==
2
)
{
char
*p = strrchr(buffer,
'\\'
);
int
len = strlen(p+
1
);
if
(len >
16
)
p = p + len -
16
;
for
(i =
0
; i < count; ++i)
{
if
(strcmp(record[i].name, p+
1
) ==
0
)
if
(record[i].line == hang)
{
++record[i].num;
break
;
}
}
if
(i == count)
{
strcpy(record[count].name, p+
1
);
record[count].line = hang;
record[count].num =
1
;
++count;
}
}
if
(count <
8
)
i =
0
;
else
i = count -
8
;
for
(; i < count; ++i)
printf(
"%s %d %d\n"
,record[i].name, record[i].line, record[i].num);
return
0
;
密码验证合格程序}
输入描述:
一组或多组长度超过2的子符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
#include <stdio.h>
#include <string.h>
int
main()
{
char
str[
1000
][
1000
];
int
i,j;
int
n=
0
;
while
(gets(str[n])!=NULL)
++n;
for
(i=
0
;i<n;i++)
{
int
a=
0
,b=
0
,c=
0
,d=
0
;
for
(j=
0
;str[i][j]!=
'\0'
;j++)
{
if
(str[i][j]>=
'0'
&&str[i][j]<=
'9'
)
a=
1
;
else
if
(str[i][j]>=
'a'
&&str[i][j]<=
'z'
)
b=
1
;
else
if
(str[i][j]>=
'A'
&&str[i][j]<=
'Z'
)
c=
1
;
else
d=
1
;
}
if
(a+b+c+d<
3
||j<=
8
)
printf(
"NG\n"
);
else
{
for
(j=
0
;j<=strlen(str[i])-
3
;j++)
{
char
temp[
100
];
char
*p1;
strncpy(temp,&str[i][j],
3
);
temp[
3
]=
'\0'
;
//每次取3个字符组成字串
p1=strstr(str[i],temp);
if
(p1!=NULL&&p1!=&str[i][j])
{
printf(
"NG\n"
);
break
;
}
}
if
(j>strlen(str[i])-
3
)
printf(
"OK\n"
);
}
}
return
0
;
}
汽水瓶
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
输入例子:
3 10 81 0数据分类处理#include<stdio.h>
int
main (){
int
m;
while
(~scanf(
"%d"
,&m)&&m!=
0
) printf(
"%d\n"
,m/
2
);
return
0
;
}
30----后续有30个整数
3----从小到大排序,第一个R<i>为0,但没有满足条件的I<j>,不输出0,而下一个R<i>是3
6--- 存在6个包含3的I<j>
0--- 123所在的原序号为0
123--- 123包含3,满足条件
输入例子:
15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123 5 6 3 6 3 0输出例子:
30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786【中级】单词倒排
# include <stdio.h>
# include <string.h>
void
Sort(
int
R[] ,
int
n)
{
int
i;
int
j;
int
temp;
for
(i=
0
; i<n ; i++)
{
for
(j=i+
1
; j<n ; j++)
{
if
(R[i] > R[j])
{
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
}
}
}
bool Fun(
int
a ,
int
b)
{
int
c1 =
0
;
char
c[
100
];
char
d[
100
];
int
i =
0
;
int
j =
0
;
if
(a>=
10
)
{
while
(a)
{
c[i] = a%
10
+
'0'
;
a /=
10
;
i++;
}
while
(b)
{
d[j] = b%
10
+
'0'
;
b /=
10
;
j++;
}
c[i] =
'\0'
;
d[j] =
'\0'
;
if
(strstr(d,c))
return
true
;
else
return
false
;
}
else
{
while
(b)
{
c1 = b%
10
;
if
(c1 == a)
return
true
;
b /=
10
;
}
return
false
;
}
}
int
main(
void
)
{
int
i , j , k;
int
t;
int
a;
int
cnt;
//计数
int
m;
//序列I的个数
int
n;
//序列R的个数
int
I[
65535
];
int
R[
65535
];
int
P[
65535
];
int
Q[
1000
];
while
(scanf(
"%d"
,&m) != EOF )
{
a =
0
;
for
(i=
0
; i<m ; i++)
{
scanf(
"%d"
,&I[i]);
}
scanf(
"%d"
,&n);
for
(j=
0
; j<n ; j++)
{
scanf(
"%d"
,&R[j]);
}
Sort(R,n);
for
(i=
0
; i<n ; i++)
{
cnt =
0
;
k =
0
;
while
(R[i] == R[i+
1
] && i<n-
1
)
i++;
for
(j=
0
; j<m ; j++)
{
if
(Fun(R[i] , I[j]))
{
Q[k++] = j;
Q[k++] = I[j];
cnt++;
}
}
if
(cnt >
0
)
{
P[a] = R[i];
P[a+
1
] = cnt;
for
(t=
1
; t<=
2
*cnt ; t++)
{
P[a+
1
+t] = Q[t-
1
];
}
a = a +
2
*cnt +
2
;
}
}
printf(
"%d "
,a);
for
(i=
0
; i<a ; i++)
{
printf(
"%d"
,P[i]);
if
(i == a-
1
)
printf(
"\n"
);
else
printf(
" "
);
}
}
return
0
;
}