郑州轻工业大学zzulioj1151~1159合集

郑州轻工业大学zzulioj1151~1159合集


1150数数多少个整数

题目描述
小明的老师给小明出了一道题目:数数一篇文章出现了多少个数字,请你帮帮他吧。
输入
输入一个字符串,由空格、英文字母、数字组成,以回车结束,长度小于1000。
输出
输出整数个数(不是数字字符个数哦)。
样例输入
365grh 27ha578
样例输出
3
提示
注意:010是两个数字,0和10
代码如下(示例):

#include<stdio.h>
int main()
{
	char a[1005];
	int i,n=0,f=0;
	gets(a);
	for(i=0;a[i]!='\0';i++){
		if(a[i]=='0'&&f==0)
			n++;
		if(a[i]>'0'&&a[i]<='9'&&f==0){
			n++;
			f=1;
		}
		if(a[i]==' '||a[i]>='a'&&a[i]<='z')
			f=0;
	}
	printf("%d\n",n);
	return 0;
}
//本题关键:用f来特殊对待010为两个数以及连在一起的数字统计

1151大整数加法题目描述

比利经常会碰到超大整数的加法运算,而普通的计算器上无法进行。因此他想你帮他写一个程序来计算结果。
输入
输入数据有多组。首先输入一个整数T,表示有T组输入。
每组输入两个大整数,并用空格隔开。每个整数最多1000位。没有负数输入。
输出
对于每组输入,输出两个整数的和,单独占一行。
样例输入 Copy
2
1 2
112233445566778899 998877665544332211
样例输出 Copy
3
1111111111111111110

代码如下(示例):

#include<stdio.h>
#include<string.h>
int main()
{
    char str1[1000],str2[1000];
    int strs1[1000],strs2[1000],strs[1000],b1,b2,i,n=0,t;
    scanf("%d",&t);
    while(t--)
    {
        n=0;
        memset(strs1,0,sizeof(strs1));
        memset(strs2,0,sizeof(strs2));
        memset(strs,0,sizeof(strs));//memset函数是string.h里的函数,表达式为memset(数组首地址,初始值,初始化大小)(其中sizeof(数组)表示数组大小),作用是初始化char数组
        scanf("%s%s",str1,str2);//读取两个大整数
        b1=strlen(str1);//b1为str1字符串长度
        b2=strlen(str2);//b2为str2字符串长度
        if(b1>b2)
        {
            n=b1-b2;//n为两个字符串长度差值
            for(i=0;i<b1;i++)
            {
                strs1[i]=str1[i]-'0';//把str1数组存到strs1数组中
                if(i<b2)//在str2长度范围内
                {
                    strs2[i+n]=str2[i]-'0';//把str2数组存到strs2数组中,
                    //要注意的是存储时进行了挪位,前面的是初始值0
                }
            }
        }
        else
        {
            n=b2-b1;
            for(i=0;i<b2;i++)
            {
                strs2[i]=str2[i]-'0';
                if(i<b1)
                {
                    strs1[i+n]=str1[i]-'0';
                }
            }
        }//这一步也是存值操作,和上方一样,只是针对b1,b2大小两种情况
        if(b1<b2)//交换,使b1>b2 
        {
            n=b1;
            b1=b2;
            b2=n;
        }
        n=0;//归零
        for(i=b1-1;i>=0;i--)
        {
            strs[i]=strs1[i]+strs2[i]+n;
            n=0;//这里n的作用是满10向前进1
            if(i>0)
            {
                if(strs[i]>=10)
                {
                    strs[i]=strs[i]%10;//求余
                    n=1;//进1 
                }
            }
        }
        for(i=0;i<b1;i++)//输出结果
        printf("%d",strs[i]);
        printf("\n");
    }
    return 0;
}

1152: 二分搜索

题目描述
在有序序列中查找某一元素x。
输入
首先输入一个正整数n(n<=100000),表示该序列有n个整数,然后按从小到大的顺序输入n个整数;
接着是一个正整数m,表示有m次查找;
最后是m个整数,表示m个要查找的整数x。
输出
对于每一次查找,有一行输出。若序列中存在要查找的元素x,则输出元素x在序列中的序号(序号从0开始);若序列中不存在要查找的元素x,则输出"Not found!"。

样例输入 Copy
5
1 3 5 7 9
11
-1
1
2
3
4
5
6
7
8
9
10
样例输出 Copy
Not found!
0
Not found!
1
Not found!
2
Not found!
3
Not found!
4
Not found!
代码如下(示例):

#include<stdio.h>
int erfen(int a[],int x,int l,int h)
{
    int m;
    if(l>h)//大于最大值 直接not found
    return -2;
    else
    {
        m=(l+h)/2;//二分搜索 
        if(x==a[m])
        return m;//返回 序号 
        else if(x<a[m])//调用本身,递归 
        return erfen(a,x,l,m-1);
        else
        return erfen(a,x,m+1,h);
    }
}
int main()
{
    int x,p,i,t,n,a[100000];
    scanf("%d",&t);
    for(i=0;i<t;i++)
    scanf("%d",&a[i]);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        p=erfen(a,x,0,t-1);
        if(p==-2)
        printf("Not found!\n");
        else
        printf("%d\n",p);
    }    
    return 0;
}

1153简易版最长序列题目描述

给你一组数(未排序),请你设计一个程序:求出里面个数最多的数。并输出这个数的长度。
例如:给你的数是:1、 2、 3、 3、 4、 4、 5、 5、 5 、6, 其中只有6组数:1, 2, 3-3, 4-4, 5-5-5 and 6.
最长的是5那组,长度为3。所以输出3。
输入
第一行为整数t((1 ≤ t ≤ 10)),表示有n组测试数据。
每组测试数据包括两行,第一行为数组的长度n (1 ≤ n ≤ 10000)。第二行为n个整数,所有整数Mi的范围都是(1 ≤ Mi < 2^32)
输出
对应每组数据,输出个数最多的数的长度。
样例输入 Copy
1
10
1 2 3 3 4 4 5 5 5 6
样例输出 Copy
3

代码如下(示例):

#include<stdio.h>
void sort(int a[],int n);//对冒泡排序函数进行声明(冒泡排序在数据结构中有详细讲解)
int main()
{
    int a[10000];
    int sum,t,i,n,max=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
          scanf("%d",&a[i]);
        sort(a,n);          //一组数据读入完成后便可进行一次排序,使该组数据全部有序
        sum=1;
        for(i=1;i<n;i++)
        {
            if(a[i]==a[i-1])//若前后2个数相等,sum++;
            {
                sum++;
                if(sum>max)//把更大的的sum赋给max;
                   max=sum;
            }
            else
                sum=1;
        }
        printf("%d\n",max);
    }
    return 0;
}
void sort(int a[],int n)//冒泡排序函数;
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=1;j<n-i;j++)
        {
           if(a[j-1]>a[j])
          {
               t=a[j-1];
               a[j-1]=a[j];
               a[j]=t; 
          }
        }
    }
}

1154: 校门外的树

题目描述
某校大门外长度为L 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米。我们可以把马路看成一个数轴,马路的一端在数轴0 的位置,另一端在L 的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
输入第一行是一个整数N,表示有N组测试数据。
每组测试数据的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L 代表马路的长度,M 代表区域的数目,L 和M 之间用一个空格隔开。
接下来的M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出
输出包括N行,每行只包含一个整数,表示马路上剩余的树的数目。
样例输入 Copy
2

500 3
150 300
100 200
470 471

10 2
3 7
6 8
样例输出 Copy
298
5
代码如下(示例):

#include<stdio.h>
int main()
{
    int n,l,m,i,j,a,b,sum=0;
    scanf("%d",&n);
    while(n--)
    {
        sum=0;
        int t[10000]={0};
        scanf("%d%d",&l,&m);
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            for(j=a;j<=b;j++)
            {
                t[j]++;
            }
        }
        for(i=0;i<=l;i++)
        {
            if(t[i]!=0)
            sum+=1;
        }
        printf("%d\n",l+1-sum);
    }
    return 0;
}

1155字符串比较 多实例题目描述

比较字符串大小,但比较的规则不同字典序规则。字符比较新规则如下:A < a < B < b < ………… < Z < z。

输入
输入数据包含多个测试实例,每个测试实例占两行,每一行有一个字符串(只包含大小写字母, 长度小于10000)。

输出
如果第一个字符串小于第二个,输出YES,否则,输出NO。
注意:A < a < B < b < ………… < Z < z。

样例输入 Copy
abc
Bbc
Ab
a
ABcef
ABce

样例输出 Copy
YES
YES
NO

代码如下(示例):

#include<stdio.h>
#include<string.h>
int main(){
	char buf1[10001], buf2[10001];
	int len1, len2,len;
	double num1, num2;  //数字化表示的结果
	while (scanf("%s%s",buf1,buf2)!=EOF)
	{
		len1 = strlen(buf1);
		len2 = strlen(buf2);
		len = len1 > len2 ? len1 : len2;
		for (int i = 0; i < len+1; i++) // len+1 表示考虑两个串的末尾 '\0'
		{
			if (buf1[i] >= 'A'&&buf1[i] <= 'Z'){
				num1 = (int)(buf1[i] - 'A')-0.5;
			}
			else if (buf1[i]>='a'&&buf1[i]<='z')
			{
				num1 = (int)(buf1[i] - 'a');
			}
			else
			{
				num1 = -1;  //比较到了 '\0' ,结果应该是NO ,故第一个应大于第二个数字
			}
			
			if (buf2[i] >= 'A'&&buf2[i] <= 'Z'){
				num2 = (int)(buf2[i] - 'A') - 0.5;
			}
			else if (buf2[i] >= 'a'&&buf2[i] <= 'z')
			{
				num2 = (int)(buf2[i] - 'a');
			}
			else
			{
				num2 = -2; //比较到了 '\0',结果应该是NO,故第二个应该小于第一个数字
			}
 
			if (num1<num2)
			{
				printf("YES\n");
				break;
			}
			else if (num1>num2)
			{
				printf("NO\n");
				break;
			}
		}
		memset(buf1, '\0', 10001);
		memset(buf2, '\0', 10001);
	}
}

1156单数变复数题目描述

输入一个名词英语单词,按照英语语法规则把单数变成复数。规则如下:
(1) 以辅音字母y结尾,变y为i,再加es;
(2) 以s, x, ch, sh结尾,则加es;
(3) 以元音o结尾,则加es;
(4) 其他情况加上s。

输入
输入一个字符串,仅含小写字母,长度不超过20。

输出
输出其对应的复数形式。

样例输入 Copy
butterfly
样例输出 Copy
butterflies

代码如下(示例):

#include <stdio.h>
#include <string.h>


int main() {
	char str[21];
	char a[] = "s", b[] = "es";
	int len;
	// 输入一个仅含小写字母的字符串 
	gets(str);
	len = strlen(str) - 1;
	// 判断结尾字符是否符合相应条件 
	if(str[len] == 'o' || str[len] == 's' || str[len] == 'x' ||
	(str[len - 1] == 'c' || str[len - 1] == 's') && str[len] == 'h')
		// 调用函数strcat()进行字符连接 
		strcat(str, b);
	else if(str[len] == 'y'){
		str[len] = 'i';
		strcat(str, b);
	}
	else
		strcat(str, a);
	// 输出数组元素 
	puts(str);
	return 0;
}

1157连续的n个1题目描述

计算机数据都是由0和1组成的,看着长长的0101001110101111011,要找出连续n个1的子串有多少个,确实麻烦,请你编程实现吧。
输入
输入第一行为一个字符串,由0和1组成,长度小于1000;输入第二行为一个正整数n。
输出
输出一个整数,表示连续n个的1的子串的个数。
样例输入 Copy
0101001110101111011
2
样例输出 Copy
6

代码如下(示例):

#include<stdio.h>
#include<string.h>
char str[1001];
int n,num=0;      //num记录连续n个1的个数
void judge(int a,int b)     //判断第a个字符时已经有连续b个1
{
    if(b==n)            //满足连续n个1时结束递归
    {
        num++;
        return;
    }
    if(str[a]=='1')     
    {
        b++;
        judge(a+1,b);       //判断下一位
    }
}
int main(void)
{
    int i,temp=0;
    scanf("%s %d",str,&n);
    for(i=0;i<strlen(str);i++)
        judge(i,temp);
    printf("%d",num);
    return 0;
}

1158又是排序(指针专题)

题目描述
将输入的四个整数按由大到小的顺序输出。
请你定义一个四个数排序的函数psort,psort的四个参数为要排序的四个整数变量的地址,请你按照从大到小的顺序把四个数分别放到四个指针所指向的变量里,不要在函数内输入输出任何内容。请务必使用函数实现四个数的排序。
void psort( int *pa, int *pb,int *pc,int *pd)
{
//实现四个数的排序,并分别放到四个指针所指向的变量里。
}

注意:本题如果采用C/C++提交时,至少要编写psort()函数和main()函数两个函数,并提交完整的程序代码。
输入
输入4个整数,用空格隔开。
输出
输出排序后的4个整数,由空格隔开。输出占一行。
样例输入 Copy
4 3 5 2
样例输出 Copy
5 4 3 2
代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void psort( int *pa, int *pb,int *pc,int *pd);
int main()
{
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    int *pa,*pb,*pc,*pd;
    pa = &a;
    pb = &b;
    pc = &c;
    pd = &d;
    psort(pa,pb,pc,pd);
    return 0;
}
void psort( int *pa, int *pb,int *pc,int *pd)
{
    //实现四个数的排序,并分别放到四个指针所指向的变量里。
    int str[4] = {*pa,*pb,*pc,*pd};
    int i,j,t;
    for(i= 0;i<4;i++)
    {
        for(j= i+1;j<4;j++)
        {
            if(str[i] <= str[j])
            {
                t = str[i];
                str[i] = str[j];
                str[j] = t;
            }
        }
        printf("%d ",str[i]);
    }

}



1159最大的两个数(指针专题)

题目描述
求n个整数中的最大的两个元素。要求定义一个函数LargestTwo(),求数组a的最大的两个元素,分别存入形参指针pfirst和psecond所指存储单元,函数原型如下:
void LargestTwo(int a[],int n,int *pfirst,int *psecond)
{
/*数组a有n个元素,将数组中的最大值存入形参指针pfirst所指内存单元,将数组中第二大的值存入形参指针psecond所指内存单元。 */
}
输入
输入有两行,输入第一行是一个整数n,1<n<=1000;第二行是n个整数,由空格隔开。
输出
输出两个整数,表示数组中最大的两个值。输出占一行。
样例输入 Copy
5
6 3 4 9 8
样例输出 Copy
9 8
代码如下(示例):

#include<iostream>
using namespace std;
void swap(int *pa,int *pb);
void LargestTow(int a[],int n,int *pfirst,int *psecond);
int  a1[1001]={0};
int   main  ()
{
    int  n;
	int  i,j;
	cin>>n;
    for ( i=0 ; i<n ; i++ )
	{
	     cin>>a1[i];
	}
	for ( i=0 ; i<n-1 ; i++ )
	{
	     for ( j=i+1 ; j<n ; j++ )
		      if ( a1[i] < a1[j] )
			  {
				  swap(&a1[i],&a1[j]);
			  }
	}
    LargestTow(a1,n,&a1[0],&a1[1]);
 
return 0;
}
 
void LargestTow(int a[],int n,int *pfirst,int *psecond)
{
       cout<<*pfirst<<' '<<*psecond;
}
void swap(int *pa,int *pb)
{
    int   t;
	t=*pa;
	*pa=*pb;
	*pb=t;
}

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘花猫不爱睡懒觉

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值