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>
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);
psort(&a,&b,&c,&d);
printf("%d %d %d %d",d,c,b,a);
return 0;
}
void psort( int *pa, int *pb,int *pc,int *pd)
{
int a;
if(*pa>*pb)
{
a=*pa;
*pa=*pb;
*pb=a;
}
if(*pa>*pc)
{
a=*pa;
*pa=*pc;
*pc=a;
}
if(*pa>*pd)
{
a=*pa;
*pa=*pd;
*pd=a;
}
if(*pb>*pc)
{
a=*pb;
*pb=*pc;
*pc=a;
}
if(*pb>*pd)
{
a=*pb;
*pb=*pd;
*pd=a;
}
if(*pc>*pd)
{
a=*pc;
*pc=*pd;
*pd=a;
}
}
1159最大的两个数(指针专题) 题目描述 求n个整数中的最大的两个元素。要求定义一个函数LargestTow(),求数组a的最大的两个元素,分别存入形参指针pfirst和psecond所指存储单元,函数原型如下: void LargestTow(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 <stdio.h>
#include <stdlib.h>
#include <limits.h>
void LargestTow(int a[],int n,int *pfirst,int *psecond);
int main()
{
int str[1005],n,i,x,y;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&str[i]);
LargestTow(str,n,&x,&y);
printf("%d %d",x,y);
return 0;
}
void LargestTow(int a[],int n,int *pfirst,int *psecond)
{
int i,q,m,b;
*pfirst=INT_MIN,*psecond=INT_MIN;
for(i=0;i<n;i++)
{
if(a[i]>*pfirst)
{
*pfirst=a[i];
q=i;
}
}
for(i=0;i<n;i++)
{
if(a[i]>*psecond&&i!=q)
{
*psecond=a[i];
}
}
}
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){ //在mn矩阵p中查找最大值,将其行下标存入pRow所指内存单元,将其列下标存入pCol所指内存单元 }
输入 输入2行3列整数,共6个。
输出 输出3个整数,矩阵中的最大值及其行下标和列下标,数据之间用空格隔开。测试数据保证最大值唯一。
样例输入 Copy 100 3 6 0 87 65 样例输出 Copy 100 0 0
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main()
{
int str[2][3],i,j,a,b,max=INT_MIN;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
scanf("%d",&str[i][j]);
if(str[i][j]>max)
{
max=str[i][j];
a=i,b=j;
}
}
printf("%d %d %d",max,a,b);
return 0;
}
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<string.h>
#include<math.h>
#include<limits.h>
void ringShift(int *a, int n, int k);
int main()
{
int n,i,k;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
ringShift(a,n,k);
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
void ringShift(int *a, int n, int k)
{
int t,i,x;
while(k--)
{
t=a[n-1];
for(i=n-1;i>0;i--)
{
a[i]=a[i-1];
}
a[0]=t;
}
}
1800少水群多刷题 题目描述
输入 多实例,读取到文件尾结束。
每个实例输入一个正整数n
输出 对每个实例:输出n行“年轻人要少水群多刷题!”(不要输出引号)
每个实例后面输出一个空行。
样例输入 Copy 1 2 样例输出 Copy 年轻人要少水群多刷题!
年轻人要少水群多刷题! 年轻人要少水群多刷题!
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
printf("年轻人要少水群多刷题!\n");
}
printf("\n");
}
return 0;
}
1604字母o的三角形 题目描述 输入正整数n<=20,输出一个n层的三角形。
输入 输入一个正整数n。
输出 输出用小写字母o组成的三角形。
样例输入 Copy 5 样例输出 Copy
提示 注意,每行最后一个字母后面没有空格
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main()
{
int n,max,i,j,o;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=n-i;j>0;j--)
{
printf(" ");
}
for(o=2*i-1;o>0;o--)
{
printf("o");
}
printf("\n");
}
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>
#include <limits.h>
#include <string.h>
int main()
{
char str[105]={0};
int len,i,q=0,p,sum=0,l;
scanf("%s",str);
len=strlen(str);
for(i=0;i<len;i++)
{
if(q==1)
{
if(str[i]=='0')
sum++;
}
if(str[i]=='.')
{
q=1;
p=i;
}
}
if(sum==len-p-1||q==0)
{
printf("No decimal part");
return 0;
}
if(q==1)
printf("0");
if(sum!=len-p-1)
{
if(str[len-1]=='0'&&q==1)
for(i=len-1;i>=0;i--)
{
if(str[i]=='0')
l++;
if(str[i]!='0')
break;
}
for(i=p;i<len-l;i++)
{
printf("%c",str[i]);
}
}
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>
void reverse(char *str);
int main()
{
char str[105];
int len,i;
scanf("%s",str);
len=strlen(str);
reverse(str);
return 0;
}
void reverse(char *str)
{
int i,q,p,len,sum=0;
len=strlen(str);
if(str[len-1]=='0')
for(i=len-1;i>=0;i--)
{
if(str[i]=='0')
sum++;
if(str[i]!='0')
break;
}
if(str[0]=='-')
{
printf("-");
for(i=len-sum-1;i>=1;i--)
printf("%c",str[i]);
for(i=1;i<=sum;i++)
printf("0");
}
else
{
for(i=len-sum-1;i>=0;i--)
printf("%c",str[i]);
for(i=1;i<=sum;i++)
printf("0");
}
}
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 a[105],b[105],c[105],m[105];
int len0,len1,len2,i;
scanf("%s",a);
scanf("%s",b);
scanf("%s",c);
len0=strlen(a);
len1=strlen(b);
len2=strlen(c);
if(cmp(a,b)==1)
{
strcpy(m,a);
strcpy(a,b);
strcpy(b,m);
}
if(cmp(a,c)==1)
{
strcpy(m,a);
strcpy(a,c);
strcpy(c,m);
}
if(cmp(b,c)==1)
{
strcpy(m,b);
strcpy(b,c);
strcpy(c,m);
}
printf("%s\n%s\n%s",a,b,c);
return 0;
}
int cmp(char *a,char *b)
{
int len1,len2,i;
len1=strlen(a);
len2=strlen(b);
if(len1>len2)
return 1;
if(len1<len2)
return -1;
if(len1==len2)
{
for(i=0;i<len1;i++)
{
if(a[i]>b[i])
return 1;
if(a[i]<b[i])
return -1;
}
return 0;
}
}
1176 查找最大字符串(指针专题) 题目描述 从键盘上输入多个字符串(每个串不超过5个字符且没有空格),用”*****”作为串输入结束的标记。从所输入的若干字符串中,找出一个最大的串,并输出该串。要求最大串的查找通过调用编写的函数实现 void find(char *name[], int n, int *p) { //在包含n个字符串的二维字符数组name中,查找值最大的字符串,将其下标存入指针p所指内存单元 }
输入 一行输入一个字符串,输入多行
输出 输出一个字符串,单独占一行。
样例输入 Copy zzzdf fdsg adff rtrt
样例输出 Copy zzzdf
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[6],b[6]="*****",max[6]={0};
while(gets(a),strcmp(a,b)!=0)
{
if(strcmp(a,max)>0)
strcpy(max,a);
}
puts(max);
return 0;
}
1166实数取整(指针专题) 题目描述 读入一个实数,输出实数的整数部分。注意该实数的位数不超过100位。输入的整数部分可能含有不必要的前导0,输出时应去掉,当然,若整数部分为0,则该0不能去掉。如输入0023.56732,输出应为23,而不是0023;0.123对应的输出应为0。当然输入也可能不含小数部分。 要求定义并使用rounding()函数,原型如下: char *rounding(char *p) { //将字符串p表示的实数取整后生成新的字符串,并由函数返回 }
输入 输入一个实数.
输出 输出整数部分。
样例输入 Copy 0012345678900.56789 样例输出 Copy 12345678900
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
int main()
{
char str[105]={0};
int len,i,q=0,p,sum=0,l;
scanf("%s",str);
len=strlen(str);
p=len;
if(str[0]=='0')
q=1;
for(i=0;i<len;i++)
{
if(str[i]=='.')
p=i;
if(q==1)
{
if(str[i]!='0')
q=0;
if(str[i]=='0')
sum++;
}
}
for(i=sum;i<p;i++)
{
printf("%c",str[i]);
}
return 0;
}
1183平面点排序(一)(结构体专题) 题目描述 平面上有n个点,坐标均为整数。请按与坐标原点(0,0)距离的远近将所有点排序输出。可以自己写排序函数,也可以用qsort库函数排序。
输入 输入有两行,第一行是整数n(1<=n<=10),接下来有n行,每行一对整数(每对整数对应一个点)。
输出 输出排序后的所有点,格式为(u,v),每个点后有一个空格。测试数据保证每个点到原点的距离都不同。
样例输入 Copy 4 1 3 2 5 1 4 4 2 样例输出 Copy (1,3) (1,4) (4,2) (2,5)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n,i,j,sum,o,t;
scanf("%d",&n);
int a[n],b[n],c[n],d[n];
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i],&b[i]);
c[i]=a[i]*a[i]+b[i]*b[i];
d[i]=i;
}
for(j=0;j<n-1;j++)
for(i=1;i<n-j;i++)
{
if(c[i-1]>c[i])
{
t=c[i-1];
c[i-1]=c[i];
c[i]=t;
t=d[i-1];
d[i-1]=d[i];
d[i]=t;
}
}
for(i=0;i<n;i++)
{
o=d[i];
printf("(%d,%d) ",a[o],b[o]);
}
return 0;
}
1702按身高站队 题目描述
输入n个学生的姓名和身高,按身高从小到大的顺序输出所有姓名。 输入
输入第一行为一个整数n(n<10),接下来的n行,每行包含一个姓名和身高,用空格隔开,姓名为长度不超过20的字符串,不含空格,身高为一个整数值。 为降低难度,输入数据保证没有任何两个人身高相同。 输出
输出n行,每行一个姓名,按身高从低到高的顺序输出。 样例输入 Copy 3 liming 182 wangling 170 zhangliang 190 样例输出 Copy wangling liming zhangliang
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n,i,j,sum,o,t;
scanf("%d",&n);
int b[n],c[n],d[n];
char a[n][21];
for(i=0;i<n;i++)
{
scanf("%s %d",a[i],&b[i]);
d[i]=i;
}
for(j=0;j<n-1;j++)
for(i=1;i<n-j;i++)
{
if(b[i-1]>b[i])
{
t=b[i-1];
b[i-1]=b[i];
b[i]=t;
t=d[i-1];
d[i-1]=d[i];
d[i]=t;
}
}
for(i=0;i<n;i++)
{
o=d[i];
printf("%s\n",a[o]);
}
return 0;
}
1184平面点排序(二)(结构体专题) 题目描述 平面上有n个点,坐标均为整数。横坐标相同时按纵坐标排序,否则按横坐标排序。本题要求用结构体存储坐标,再进行排序。先升序排序输出,再降序排序输出,可以自己写排序函数,也可以用qsort库函数排序。
输入 第一行是整数n(1<=n<=100),表示接下来有n行,每行两个整数,表示平面上一个点的坐标。
输出 输出有两行,即排序后的点,格式为(u,v),每个点后有一个空格。第一行升序排序结果,第二行降序排序结果。
样例输入 Copy 4 1 3 2 5 1 4 4 1
样例输出 Copy (1,3) (1,4) (2,5) (4,1) (4,1) (2,5) (1,4) (1,3)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n,i,j,sum,o,t;
scanf("%d",&n);
int a[n],b[n];
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
for(j=0;j<n-1;j++)
for(i=1;i<n-j;i++)
{
if(a[i-1]>a[i])
{
t=a[i-1];
a[i-1]=a[i];
a[i]=t;
t=b[i-1];
b[i-1]=b[i];
b[i]=t;
}
if(a[i-1]==a[i])
{
if(b[i-1]>b[i])
{
t=b[i-1];
b[i-1]=b[i];
b[i]=t;
}
}
}
for(i=0;i<n;i++)
{
printf("(%d,%d) ",a[i],b[i]);
}
printf("\n");
for(i=n-1;i>=0;i--)
{
printf("(%d,%d) ",a[i],b[i]);
}
return 0;
}
|