算法-指针题目oj

Q1:字符串逆序

Description
编写一个函数,功能是使输入的字符串逆序输出。

Input
输入一串字符串,注意字符串中不要有空格。

Output
输出该字符串的逆序。

Sample

Input

ABCDEFG

Output

GFEDCBA

Hint

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

int fuction(char *s, int n)
{
    char *p;
    for(p=s+n-1;p>=s;p--)
        printf("%c",*p);
    printf("\n");
    return 1; //题目中并未提出对返回值的要求,随便输出1
}

int main()
{
    char str[100];
    scanf("%s",str);
    int len;
    len=strlen(str);
    int fuction(char *, int);
    fuction(str,len);
    return 0;
}

Q2:又见回文

Description
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。现在呢,就是让你判断输入的字符串是否是回文串。

Input
有多组输入,每行输入一串字符,保证字符串长度不会大于 100000,字符串由大小写英文字母和空格组成,以字符串“2022”作为结束标志。

Output
每行输出一个字符串,如果输入是回文串,输出“YES”,否则输出“NO”(注意:判断的时候空格是不作判断的,详见样例)

Sample

Input

aaaa

ggg g

lozxvxoMJBCHsTXooXTsHCBJMoxvxzol

i am a good acmer

2022

Output

YES

YES

YES

NO

Hint

#include <stdio.h>
#include <string.h>
int funct(char *a)
{
    int len=strlen(a);
    char *p=a,*q=a+len-1;
    while(p < q){//p为a的首地址,q为a的尾地址
        if(*q == ' '){//指针q向前移动,如果遇到空格继续减1;
            q--;
            continue;
        }
        if(*p == ' '){//指针p向后移动,如果遇到空格继续加1;{
            p++;
            continue;
        }
        if(*q == *p){//如果两个指针代表的字符相等,则向中间同时移动;
            p++;
            q--;
        }
        else
            return 0;
    }
    return 1;
}
 
int main()
{
    char a[111000];
    while(gets(a)){
        if(strcmp(a,"2022")==0){
            break;
        }
        if(funct(a))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
 
Q3: 最大的两个数

Description
求n个整数中的最大的两个元素。要求定义一个函数LargestTow(),求数组a的最大的两个元素,分别存入形参指针pfirst和psecond所指存储单元,函数原型如下:

**void LargestTow(int a[],int n,int pfirst,int psecond)
{
/*数组a有n个元素,将数组中的最大值存入形参指针pfirst所指内存单元,将数组中第二大的值存入形参指针psecond所指内存单元。 */
}

Input
输入有两行,输入第一行是一个整数n,1<n<=1000;第二行是n个整数,由空格隔开。
Output
输出两个整数,表示数组中最大的两个值。输出占一行

Sample

Input

5
6 3 4 9 8

Output

9 8

Hint

#include<stdio.h>
void LargestTow(int a[],int n,int *pfirst,int *psecond)
{
	int i;
	*pfirst=*a;
	*psecond=*(a+1);
	for(i=0;i<n;i++)    //通过遍历确定最大值 
	{
	    if(*(a+i)>*pfirst)
	        *pfirst=*(a+i);
		    	
	}
	for(i=0;i<n;i++)   //通过遍历确定第二大的数值
	{
		if(*(a+i)>*psecond && *(a+i)!=*pfirst)
		    *psecond=*(a+i);  
	}
}
int main()
{
	int i,n;
	int num[1000];
	int first,second;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    scanf("%d",&num[i]);
	LargestTow(num,n,&first,&second);   // 使用 & 取地址引用
	printf("%d %d\n",first,second);   
	return 0;
 }

Q4: 大整数

Description
输入3个非负大整数,位数不超过100位,按从小到大的顺序输出这三个整数。要求定义并使用如下函数比较两个大整数的大小。
**int cmp(char a,char b)
{
//若大整数a大于b,返回1;
//若a小于b,返回-1;
// 若a与b相等,返回0
}

Input
输入有3行,每行输入一个大整数,位数不超过100位,输入不含前导0。
Output
输出3行,即排序后的3个大整数。

Sample

Input

1234567890123456789
99999999999999
111111111111111

Output

99999999999999
111111111111111
1234567890123456789

Hint

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(char *a,char *b){
	//若大整数a大于b,返回1;
	//若a小于b,返回-1;
	// 若a与b相等,返回0
	int length1 = strlen(a);
	int length2 = strlen(b);
	if (length1>length2)
	{
		return 1;
	}
	else if (length1<length2)
	{
		return -1;
	}
	else{
		for (int i = 0; i < length1; i++)
		{
			if (*(a + i) < *(b + i)){
				return -1;
			}
			else if (*(a + i) > *(b + i))
			{
				return 1;
			}
		}
		return 0;
	}
}
 
int main(){
	char *p[3],temp[100];
	for (int i = 0; i < 3; i++)
	{
		p[i] = (char*)malloc(sizeof(char)*100);
		scanf("%s",p[i]);
	}
	for (int i = 0; i < 3; i++)
	{
		for (int j = i + 1; j < 3; j++){
			if (cmp(p[i],p[j])>0)
			{
				strcpy(temp,p[i]);
				strcpy(p[i],p[j]);
				strcpy(p[j],temp);
			}
		}
	}
	for (int i = 0; i < 3; i++)
	{
		puts(p[i]);
	}
}
Q5: 实数的小数部分

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

Input
输入一个实数。不超过100位。
Output
输出小数部分,输出占一行。

Sample

Input

111111.12345678900012345678900

Output

0.123456789000123456789

Hint

#include<stdio.h>
#include<stdlib.h>
char *decimal(char *p){
	char *q;
	int i, j;
	q = (char*)malloc(sizeof(char)*100);
	for (i = 0; i < strlen(p); i++)
	{
		if (*(p+i)=='.')   //找到 '.' 开始的位置
		{
			break;
		}
	}
	j = 0;
	while (i<strlen(p))
	{
		//*(q++) = *(p++);
		q[j++] = p[i++];  //复制到一个新的串中
	}
	q[j] = '\0'; 
 
	
	j--;
	while (q[j]=='0')   //判断是否为 '0'
	{
		q[j] = '\0';
		j--;           //j  始终指向 '\0' 的前一个字符位
	}
 
	if (q[j]=='.')  //小数位为0
	{
		return NULL;
	}
	return q;
}
 
int main(){
	char buf[100];
	gets(buf);
	char *p;
	p = decimal(buf);
	if (p!=NULL)
	{
		printf("0%s",p);
	}
	else
	{
		printf("No decimal part\n");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值