问题 BI: 哥德巴赫猜想验证
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
题目描述
编写程序,在[m,n]范围内验证“任意大于2的偶数可以分解为2个素数之和”。其中,n、m在主函数中从键盘输入,分解偶数用函数resolve()实现,并在分解函数中嵌套判断素数的函数isprime()。主函数main()及程序主体已经完成,请根据给出下面的函数原型,写出分解函数和判断素数函数。
函数原型:
int isprime(int n); /* 判断整数n是否素数,是返回1,否则返回0 */
int resolve(int n); /* 分解偶数n,返回值为分解结果中最小的素数 */
提示
最小的素数是2;且在偶数分解过程中要求找到满足条件的最小素数所在的那组素数。
题目只提交指定的两个函数,不能提交main()。
#include<stdio.h>
int isprime(int n);
int resolve(int n);
int main(){
int a;
scanf("%d",&a);
printf("%d",resolve(a));
}
int isprime(int n){
int i;
if(n==2){
return 1;
}
for(i=2;i<n;i++){
if(n%i==0){
return 0;
break;
}
}
return 1;
}
int resolve(int n){
int i;
for(i=2;i<n;i++){
if(isprime(i) && isprime(n-i)){
return i;
break;
}
}
return 0;
}
问题 AV: 删除子串
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
题目描述
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。要求实现函数:
int delSubStr(char * src, char * sub,char * result);
【输入】 src:输入的被操作字符串
sub:需要查找并删除的特定子字符串
【输出】 result:在src字符串中删除所有sub子字符串后的结果
【返回】 删除的子字符串的个数
提示
注:I、子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
II、不用考虑超长字符串的情况。
示例:输入:src = "abcde123abcd123",sub = "123" 输出:result="abcdeabcd"
返回:2
#include<stdio.h>
#include<string.h>
int delSubStr(char * src, char * sub,char * result)
{
int count = 0;
int k = 0;
int i;
char *p3 = result;
for(i = 0; src[i] != '\0'; i++)
{ int tem = i; //tem保留主串中的起始判断下标位置
int j = 0;
while((src[i] != '\0') && (sub[j] != '\0') && (src[i] == sub[j]))
{
i++;
j++;
}
if(sub[j] != '\0') //说明while循环src从i开始的字符串中未能成功匹配sub,直接将src中下标i的字符复制到p3当中
{ i = tem; p3[k] = src[i]; k++; } //k标识p3所复制到的下标
else
{ count += 1; i--; } //为了与sub相匹配,sub到了'\0',src中的i多向前移动了一位,所以i--,让i++的动作交给for循环。
}
return count;
}
int main()
{
char str[100];
char sub[100];
gets(str);
gets(sub);
char res[50] ="";
int count;
count = delSubStr(str, sub, res);
printf("子字符串的个数是:%d\n", count);
printf("删除子字符串后:%s\n", res);
return 0;
}
问题 AT: 寻找亲近的同学
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
题目描述
小明喜欢把他的同学分类,每一类用一个大写英文字母标记。他只乐意亲近一部分类型的同学。请从小明的同学中挑出他愿意亲近的同学。
输入
输入三行。 第一行是一个正整数m,m是小明的学号。 第二行是由大写字母组成的字符串,其中的字符表示小明喜欢的类型。 第三行是由大写字母 组成的字符串,其中的字符是小明同学(包含他自己)的类型,按照学号有序。学号从1开始,没有间断和重复。小明的同学最多不超过1000个。
输出
按照从小到大的顺序依次输出小明喜欢的同学的学号。每两个学号之间用一个空格分隔。 如果没有找到小明喜欢的同学,则输出"Lonely Xiao Ming"。
样例输入 复制
1
ABC
BPTYHJKAMNBPHC
样例输出 复制
8 11 14
#include<stdio.h>
#include<string.h>
int main(){
char xh[100];
char str[1010];
int id;
int i,j;
int index=-1;
scanf("%d",&id);
scanf("%s",xh);
scanf("%s",str);
for(i=0;i<strlen(str);i++){
for(j=0;j<strlen(xh);j++){
if(str[i]==xh[j]&&(i+1)!= id){
index=i;
}
}
}
if(index==-1){
printf("Lonely Xiao Ming\n");
}else{
for(i=0;i<index;i++){
for(j=0;j<strlen(xh);j++){
if(str[i]==xh[j]&&(i+1)!= id){
printf("%d ",i+1);
}
}
}
printf("%d\n",index+1);
}
}
问题 AU: 城市电话号码
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
题目描述
某城市电话号码包括地区码、前缀、有效号码三部分组成,其中地区码是0-4位数字;前缀是以非0开头的3位数字,有效号码是4位数字,各部分之间用减号(-)分隔,地区码为空时地区码与前缀之间不包含分隔符。请编写函数检测输入号码num的有效性,若输入号码符合上述规定返回0,否则返回1。函数原型定义如下:
int CheckPhoneNum(char * num);
#include<stdio.h>
#include<string.h>
int main(){
int CheckPhoneNum(char *num);
char num[100];
scanf("%s",num);
int t=CheckPhoneNum(num);
printf("%d",t);
return 0;
}
int CheckPhoneNum(char *num){
int n=strlen(num);
if(n<8||n>13) //两段数8位,三段数10-13位之间
return 1;
if(n==8){
if(num[0]=='0')
return 1;
} //前缀首位数不为0
int count=0;//不是数字个数
int i;
//确保输入的全为数字或者"-"
for(i=0;i<n;i++){
if(num[i]<'0'||num[i]>'9'){
count++;
if(num[i]!='-') //出现除数字和-的其他字符
return 1;
}
}
//两段数检查
if(n==8){
if(count!=1) //“-”个数多于1个判错
return 1;
if(num[3]!='-') //"-"出现位置错误
return 1;
return 0;
}
//三段数检查
if(n>=10&&n<=13){
if(count!=2) //“-”个数多于2个判错
return 1;
if(num[n-9]!='-'||num[n-5]!='-'||num[n-8]=='0') //'-'位置正确且前缀首位不为0
return 1;
return 0;
}
}
问题 BB: 超简计算器
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
题目描述
编写程序计算给定表达式的值并输出,表达式中的操作数均为浮点数,运算符只包括+、-、*和/,表达式从左向右求值(所有运算符的优先级都一样)。
输入
一个合法的算术表达式
输出
表达式的值,输出保留小数点后3位数字
样例输入 复制
1+2.5*3
样例输出 复制
10.500
提示
注意:表达式长度不定,其中运算符个数也不定,但只包含+、-、*及/。
为使scanf函数正确检测表达式结束,可以接受并判断其返回值,若返回值为EOF,则表示表达式结束。例如:
while(scanf("%lf",&r)!=EOF);表示在键盘输入没结束前,始终继续循环输入。
#include <stdio.h>
int main()
{
float f, r;
char ch;
scanf("%f", &r);
while((ch = getchar())!=EOF)
{
scanf("%f", &f);
switch(ch)
{
case '+':
r+=f;
break;
case '-':
r-=f;
break;
case '*':
r*=f;
break;
case '/':
r/=f;
break;
}
}
printf("%.3f", r);
}