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");
}
}