C语言实习题(二)

问题 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);
}

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值