郑州轻工业大学zzulioj1160~1169合集

郑州轻工业大学zzulioj1160~1169合集

1160矩阵的最大值(指针专题)

题目描述
找出一个2×3的整数矩阵中的最大值及其行下标和列下标,要求调用函数FindMax(int p[][3], int m, int n, int *pRow, int *pCol)实现,行下标和列下标在形参中以指针的形式返回。
void FindMax(int p[][3], int m, int n, int *pRow, int pCol){
//在m
n矩阵p中查找最大值,将其行下标存入pRow所指内存单元,将其列下标存入pCol所指内存单元
}
输入
输入2行3列整数,共6个。
输出
输出3个整数,矩阵中的最大值及其行下标和列下标,数据之间用空格隔开。测试数据保证最大值唯一。
样例输入 Copy
100 3 6
0 87 65
样例输出 Copy
100 0 0
代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
void FindMax(int p[][3], int m, int n, int *pRow, int *pCol)
{ int max=0,i,j;
    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
        {
            if(p[i][j]>=max)
                max=p[i][j];
        }
        int flag=0;
    for(i=0; i<m; i++)
    {
         for(j=0; j<n; j++)
        {
            if(p[i][j]==max)
            {
                pRow=&i;
                pCol=&j;
                flag=1;
                break;
            }
        }
        if(flag==1)
            break;
    }
 
        printf("%d %d %d\n",max,*pRow,*pCol);
}
int main()
{
    int a[2][3];
    int i,j;
    int *prow=0,*pcol=0;
    for(i=0; i<2; i++)
    {
        for(j=0; j<3; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    FindMax(a,2,3,prow,pcol);
    return 0;
}

1161字符串长度(指针专题)

题目描述
编写一函数len,求一个字符串的长度,注意该长度不计空格。要求用字符指针实现。在主函数中输入字符串,调用该len函数后输出其长度。
int len(char *sp)
{
//实现sp所指串的长度,不计空格。
}
输入
输入一个字符串,以回车结束,长度不超过100。
输出
输出一个整数,单独占一行。
样例输入 Copy
What day is today?
样例输出 Copy
15
代码如下(示例):

#include <stdio.h>
#include <string.h>
// 函数原型声明 
int len(char *sp);
// 求字符串长度 
int main() 
{
	char a[101];
	int t;
	// 输入字符 
	gets(a);
	// 调用函数len求字符长度
	t = len(&a);
	printf("%d", t);
	return 0;
}
// 函数返回字符串长度 
int len(char *sp)
{
	int t = 0;
	int i, l;
	l = strlen(sp);
	for(i = 0; i < l; i++)
	{
		if(sp[i] != ' ')
		{
			t++;
		}
	}
	return t;
}

1162循环移动(指针专题)

题目描述
有n个整数,使前面各数顺序向后移动k个位置,移出的数再从开头移入。输出移动后的数组元素。
题目没有告诉你n的范围,希望你读入n之后用malloc()函数动态申请内存空间,不要提前定义数组的大小。不要偷懒哦。
另外要求定义并使用函数ringShift()
void ringShift(int *a, int n, int k)
{
//循环移动后的数值仍然存入数组a中
}
输入
输入分3行,第一行是一个整数n,第二行是n个整数,用空格隔开。第三行是一个整数k。
输出
输出n个整数,由空格隔开。输出占一行。
样例输入 Copy
6
1 2 3 4 5 6
2
样例输出 Copy
5 6 1 2 3 4
代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
void ringShift(int *a, int n, int k);
int main()
{
    int n,i;
    scanf("%d",&n);
    int *p = (int *)malloc( n* sizeof(int));
    //(int*)用于指针类型转换,将malloc返回的通用指针(void*)强制转化为指向int类型的指针;
    //n*sizeof(int)计算要分配的内存大小;malloc(n*sizeof(int))返回起始地址指针
    for(i= 0;i<n;i++)
    scanf("%d",&p[i]);
    int k;
    scanf("%d",&k);
    ringShift(p,n,k);
    return 0;
}
void ringShift(int *a, int n, int k)
{
//循环移动后的数值仍然存入数组a中
    int len,i;
    len = n;
    int *b = (int *)malloc(k*sizeof(int));
    for(i = 0;i<k;i++)
    b[i] = a[len-k+i];///保存a中被破坏的数字
    for(i = n-1;i>=k;i--)
        a[i] = a[i-k];///将a中数字顺序右移
    for(i = 0;i<k;i++)///将保存的数字赋值
    a[i] = b[i];
    for(i = 0;i<n;i++)
    printf("%d ",a[i]);
}

1163亲和串(字符串)

题目描述
判断亲和串。亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
输入
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
输出
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
样例输入 Copy
AABCD
CDAA
ASD
ASDF
ab
aba
样例输出 Copy
yes
no
no
代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s1[200002];
char s2[100001];
char s[100001];//宏定义
int main()
{
    while(scanf("%s%s",&s1,&s2) != EOF)
    {
        if(strlen(s1) < strlen(s2))
            printf("no\n");//第一步排除s1中个数少于s2的情况少于则输出no
        else
        {
            strcpy(s,s1);//把s1装入s中
            strcat(s1,s);//把s接入s1中,这两个函数包括strstr都是在<string.h>头文件中的
            if(strstr(s1,s2) != NULL)//在变化后的双倍的s1中找不到s2的下表就输出no
                printf("yes\n");
            else
                printf("no\n");
        }
    }
    return 0;
}

1164字符串加密

题目描述
输入一串字符(长度不超过100)和一个正整数k,将其中的英文字母加密并输出加密后的字符串,非英文字母不变。加密思想:将每个字母c加一个序数k,即用它后面的第k个字母代替,变换公式:c=c+k。如果字母为z,则后一个字母是a,也就是字母字符形成一个圆。
输入
输入第一行是若干字符,以回车结束。输入第二行是一个整数k,k是int范围内的正整数;
输出
输出加密后的字符串。
样例输入 Copy
12kjsdZjk
280
样例输出 Copy
12edmxTde

代码如下(示例):

#include<stdio.h>
#include<string.h>
#define N 100
int main(){
    char str[N];
    int k,a=0;
    gets(str);
    scanf("%d",&k);
   for(int i=0; str[i]!='\0'; i++)
    {
        if(str[i]>='a'&&str[i]<='z')
        {//主要方法就是%26取余数
            str[i]=(str[i]-'a'+k)%26+'a';//这里注意+'a'别忘记了
            a=1;
        }
        if(str[i]>='A'&&str[i]<='Z')
        {
            str[i]=(str[i]-'A'+k)%26+'A';
            a=1;
        }
    }
    if(a==1) 
    puts(str);
    return 0;
}

1165实数的小数部分(指针专题)

题目描述
读入一个实数,输出该实数的小数部分,小数部分若多余的末尾0,请去掉。如输入111111.12345678912345678900
则输出0.123456789123456789。若去掉末尾0之后小数部分为0,则输出“No decimal part”。注意该实数的位数不超过100位。
请定义并使用如下函数。
char *decimal(char *p)
{
将字符串p表示的实数的自小数点开始的小数部分存入一个字符串,并由函数返回,若p为“123.456”,则返回的字符串为“.456”。若小数部分为0,返回空指针NULL。
}
输入
输入一个实数。不超过100位。
输出
输出小数部分,输出占一行。
样例输入 Copy
111111.12345678900012345678900
样例输出 Copy
0.123456789000123456789
代码如下(示例):

#include<stdio.h>
#include<stdlib.h>
char *decimal(char *p)
{
	char *a;
	int i,j=0,f=0;
	a=(char *)malloc(100*sizeof(char));
	for(i=0;p[i]!='\0';i++)
	{
		if(p[i]=='.')
			f=1;
		if(f==1)
			a[j++]=p[i];//这里a是从a[0]开始要和a[++j]区分开来,后者是从a[1]开始
	}
	a[j]='\0';
	while(j--)
	{
		if(a[j]=='0')
			a[j]='\0';
		else
			break;//这一步必须有跳出,因为可能小数部分含有0
	}
	if(a[j]=='.')
		return NULL;
	return a;
}
int main()
{
	char *a,p[105];
	int i;
	gets(p);
	a=decimal(p);
	if(a!=NULL)
		printf("0%s\n",a);
	else
		printf("No decimal part\n");
	return 0;
}

1166实数取整(指针专题)题目描述

读入一个实数,输出实数的整数部分。注意该实数的位数不超过100位。输入的整数部分可能含有不必要的前导0,输出时应去掉,当然,若整数部分为0,则该0不能去掉。如输入0023.56732,输出应为23,而不是0023;0.123对应的输出应为0。当然输入也可能不含小数部分。
要求定义并使用rounding()函数,原型如下:
char *rounding(char *p)
{
//将字符串p表示的实数取整后生成新的字符串,并由函数返回
}

输入
输入一个实数,该实数的位数不超过100位。
输出
输出整数部分。
样例输入 Copy
0012345678900.56789
样例输出 Copy
12345678900

代码如下(示例):

#include<stdio.h>
#include<string.h>
#define N 110
char *rounding(char *p)
{
    char *q;
    //跳过0
    while(*p=='0')
    {
        p++;
    }
    //若跳过0之后为'.'或者'\0'  则p=0
    while(*p=='.'||*p=='\0')
    {
        p--;
    }
    q=strchr(p,'.');//返回第一次出现'.'的位置,指针q指向这个位置
    if(q!=NULL)//找到'.'位置,替换成'\0';
        *q='\0';
    return p;
}
int main()
{
    char *p;
    p=(char *)malloc(sizeof(char)*N);
    gets(p);
    printf("%s\n",rounding(p));
    return 0;
}

1167逆转数(指针专题)

题目描述
任意给你一个整数,这个数可能很大(最长不超过100位),你能求出它的逆转数吗?
逆转数定义如下:
1.一个末尾没有0的整数,它的逆转数就是各位数字逆序输出;
2.一个负数的逆转数仍是负数;
3.一个末尾有0的整数,它的逆转数如同下例:
reverse (1200) = 2100
reverse (-56) = -65
要求定义并使用如下函数:
void reverse(char *str)
{
//函数求出str的逆转数并存入str。
}
输入
输入一个长整数str,不超过100位,输入的整数不含前导0。

输出
输出str的逆转数。输出占一行。

样例输入 Copy
-123456789000
样例输出 Copy
-987654321000
代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 100
//函数求出str的逆转数并存入str。
void reverse(char *str);
int main()
{
    char *p;
    p=(char*)malloc(sizeof(char)*N);
    gets(p);
    reverse(p);
    return 0;
}
void reverse(char *str)
{
    int minus=0;
    //char *str1;
    int i,len,count=0,flag=0;
    len=strlen(str);
    //str1=(char *)malloc(sizeof(char)*N);
    if(str[0]=='-')
    {
         minus=1;//记录负号
         printf("-");
    }
 
    for(i=len-1; i>=1; i--)
    {
        if(str[i]=='0'&&flag==0)
        {
            count++;//记录零的个数
            continue;
        }
        if(str[i]!='0'||flag!=0)
        {
            printf("%c",str[i]);
            flag=1;//尾数是否为零
        }
 
    }
    if(minus==0)
        printf("%c",str[0]);
 
    for(i=1; i<=count; i++)//Wrong answer:i从1开始,不然输入0,有两个零输出;
        printf("0");
}

1168账单(指针专题)

题目描述
每到月末,小明就会对这个月的支出账单进行整理和统计。如今电脑已经普及大学校园,所以小明想让电脑帮忙做这件事情。聪明的你就为小明编一个程序来完成这件事情吧。
输入
首先输入一个整数ncase,表示测试实例的个数。每个测试实例的输入如下:
第一行是整数n (n<100)。然后是n行的账单信息,每一行由事物的名字name和对应的花费c组成,长度不超过200。中间会有一个或多个空格,而每一行的开头和结尾没有空格。 0.0 < c < 1000.0。
输出
每个测试实例对应一行输出,输出总的花费,小数点后保留一位数字。
样例输入 Copy
2
1
Buy books 62.28
3
Apple 2.3
Buy clothes for girl friend 260.5
Go to cinema 30
样例输出 Copy
62.3
292.8
代码如下(示例):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 105
double TotalCost(int n );
int  main  ()
{
      double sum=0.0;
	  int  n,t;
	  scanf("%d",&n);
	  while ( n-- )
	  {
	      scanf("%d",&t);
		  getchar();//消掉回车
          sum = TotalCost(t);
		  printf("%.1f\n",sum);
	  }
return 0;
}
double TotalCost(int n )
{
      char *p;
      double sum=0.0;
	  double f;
	  p = (char *)malloc(sizeof(char)*N);
	  while ( n-- )
	  {
	      gets(p);
		  p = strrchr(p,' ');
		//从后向前查找空格,并返回从字符串中的这个位置起,一直到字符串结束的所有字符
		  sscanf(p,"%lf",&f);
//从字符串p中读取一个double类型的数据存入f
		  sum+=f;	  
	  }
return sum;
}

1169大整数(指针专题)

题目描述
输入3个非负大整数,位数不超过100位,按从小到大的顺序输出这三个整数。要求定义并使用如下函数比较两个大整数的大小。
int cmp(char *a,char *b)
{
//若大整数a大于b,返回1;
//若a小于b,返回-1;
// 若a与b相等,返回0
}
输入
输入有3行,每行输入一个大整数,位数不超过100位,输入不含前导0。
输出
输出3行,即排序后的3个大整数。
样例输入 Copy
1234567890123456789
99999999999999
111111111111111
样例输出 Copy
99999999999999
111111111111111
1234567890123456789
代码如下(示例):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(char *a,char *b);
int main()
{
	char *str[3],temp[100];  //定义一个字符指针数组,每一个数组元素都是一个指向字符串的指针
	int i,j;
	for(i=0;i<3;i++)
	{
		str[i]=(char *)malloc(100*sizeof(char));  //指针字符数组每个元素赋值前要动态分配内存
		scanf("%s",str[i]);  
	}
	
	for(i=0;i<3;i++)
	for(j=i+1;j<3;j++)
	{
		if(cmp(str[i],str[j])==1)
		{
			//若str[i]比str[j]大,利用strcpy字符串复制函数将两个元素的字符串互换 
			strcpy(temp,str[i]);
			strcpy(str[i],str[j]);
			strcpy(str[j],temp); 
		}
	}
	
	for(i=0;i<3;i++)
	printf("%s\n",str[i]);
	return 0; 
}

int cmp(char *a,char *b)
{
	int len1,len2,i;
	len1=strlen(a);
	len2=strlen(b);
	if(len1>len2) return 1;
	else if(len1<len2)  return -1;
	else
	{
		for(i=0;i<len1;i++)
		{
			if(*(a+i)>*(b+i))  return 1;
			else if(*(a+i)<*(b+i))  return -1;
		 } 
		 return 0;
	 } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

橘花猫不爱睡懒觉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值