上机实践复习
上机实践复习 ? 一.数的距离差 给定一组正整数,其中的最大值和最小值分别为 max和 min,其中的一个数 x 到 max 和 min的距离差D定义为 abs(abs(x-max)-abs(x-min))。
其中,abs()表示求一个数的绝对值 输入 输入第一行为整数 n,剩余 n 行每行一个正整数。
输出 输出仅一行,它的值为使得距离差 D 最小的 x。
样例输入 5 3 1 7 5 9 样例输出 提示 函数 abs()定义在中 例:
#include #include #define N 400 int main(){ int a[N],D[N];int i,n,max,m,min,D_min;scanf(for(i=0;i max=a[0];for(i=1;i if(max max=a[i];min=a[0];for(i=1;i { if(min>a[i])min=a[i];} for(i=0;i
{ D[i]=abs(abs(a[i]-max)-abs(a[i]-min));} D_min=D[0];for(i=1;i if(D_min>D[i]){ D_min=D[i];m=a[i];} } printf( } #include #include #define N 500 int main(){ int a[N],n,i,m,p,r,s,t;return 0;scanf(for(i=0;i scanf( } p=m=a[0];for(i=1;i if(m>a[i])m=a[i];if(p p=a[i];} s=abs(abs(a[0]-p)-abs(a[0]-m));t=a[0];for(i=1;ir)} printf(return 0;{ s=r;t=a[i];} } 二、按位转换整 数 到 英 文 单 词 题 目 描 述 请把输入整数的每位数字转换成英文。
如当输入 1024 时,输出:one, zero, two, four 输 入 输 入 为 一 个 整 数 输出 按整数每一位输出其英文单词,单词间用逗号加空格分隔,单词小写字母组成。
样例输入 20345 样例输出 two, zero, three, four, five 提示
注意:大家要考虑数据为“0”的情况,此时如果取对 0 取对数会出错 例:
#include #define N 200 int main(){ int n,k,j,s;int a[N];scanf( j=0;s=0;while(n!=0){ k=n?;n=n/10;a[j]=k;} j++;s=s+j;for(j=s-1;j>0;j--){ switch(a[j]){ case 0: printf( case 1: printf( case 2: printf( case 3: printf( case 4: printf( case 5: printf( case 6: printf( case 7 : printf( case 8 : printf( case 9 : printf( } } switch(a[0]){ case 0: printf( case 1: printf( case 2: printf( case 3: printf( case 4: printf( case 5: printf( case 6: printf( case 7 : printf( case 8 : printf( case 9 : printf( } return 0;} #include #define N 500 int main(){ int m,i,a[N],n;scanf(
i=0;if(m==0)printf( else while(m!=0){ a[i]=m?;i++;m=m/10;} n=i-1;for(i=n;i>=0;i--){ if(i!=0){ } switch(a[i]){ case 0:printf( } case 1:printf(case 2:printf(case 3:printf(case 4:printf(case 5:printf(case 6:printf(case 7:printf(case 8:printf(case 9:printf( else { switch(a[i]){ case 0:printf(case 1:printf(case 2:printf(case 3:printf(case 4:printf(case 5:printf(case 6:printf(case 7:printf(case 8:printf(case 9:printf( ? ? } } } } return 0;三、将字符串中的小写字母转换成大写字母 题目描述 给定一个字符串,将其中所有的小写字母转换成大写字母 输入 一个字符串 输出 将输入的字符串中所有小写字母转换成大写字母后的字符串 样例
输入 helloworld123Ha 样例输出 HELLOWORLD123HA 例:
#include #define N 200 int main(){ int i;char c,str[N];gets(str);i=0;while(str[i]!=‘ ’){ if(str[i]>=‘a’&&str[i] str[i]=str[i]-32;} i++;} puts(str);return 0;} 例 #include #include #define N 500 int main(){ char a[N];int i,n;scanf(n=strlen(a);for(i=0;i if(a[i]>=‘a’ && a[i] a[i]=a[i]-32;} a[n]=‘ ’;printf(return 0;} 四、最长最短单词 输入 1 行单词,空格和逗号都是单词间的间隔,试输出第 1 个最长的单词和第 1 个最短单词。
如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。
输入 一行单词,空格和逗号都是单词间的间隔 输出 两行输出 第1行,第一个最长的单词 第2 行,第一个最短的单词 样例输入 I am studying Programming language C in Nanjing University of Information and Technology 样 例 输 出 Programming #include #include char str[4000];char out[200][200];int length[200];int main(void){ gets(str);int i,j=0,k=0,n=strlen(str);for(i=0;i if(str[i]==‘ ‘||str[i]==‘,’){ out[j][k]=‘ ’;length[j]=strlen(out[j]);j++;k=0;continue;} out[j][k++]=str[i];} int max=0,min=0;for(i=1;i if(length[max] if(length[min]>length[i])min=i;} puts(out[max]);puts(out[min]);return 0;} 五、计算绩点 题目描述 学校对本科生的成绩施行平均学分绩点制。将学生的实际考分根据不同的学科的不同学分按一定 的公式进行计算。
曾经使用的规定如下:
实 际 成 绩 绩 点 90-100 85-89
82-84 78-81 75-77 72-74 68-71 64-67 60-63 60 以下 0 1.一门课程的学分绩点=该课绩点*该课学分 2.总评绩点=所有学科绩点之和/所有课程学分之和 现要求你编写程序求出某人 A 的总评绩点。
输入 第一行 总的课程数 n; 第二行 相应课程的学分; 第三行 对应课程的实际得分; 此处输入的所有数字均为整数。
输出 输出有一行,总评绩点,精确到小数点后 2 位小数。
样例输入 5 4 3 4 2 3 91 88 72 69 56 样 例 输 出 #include #include int main(){ int n,i;float a[10],c[10],b[10],sum=0,GPA,d;scanf( for(i=0;i scanf( if(b[i]>=90)c[i]=;else if(b[i]>=85)c[i]=;else if(b[i]>=82)c[i]=;else if(b[i]>=78)c[i]=;else if(b[i]>=72)c[i]=;else if(b[i]>=68)c[i]=;else if(b[i]>=64)c[i]=;else if(b[i]>=60)
c[i]=;else b[i]=0;} for(i=0;i GPA=sum/d;printf( return 0;} 六、按要求排序 输入 第一行为一个整数 N(1 第二行为 N个绝对值不超过 10000 的整数,表示需要排序的序列输出 输出 N 行,为N 个整数按升序排序后的序列样例输入 6 100 201 6 8 10 99 样例输出 ? ? 6 8 10 99 100 201 提示 这 N 个数需要随机产生 例:
#include #define N 1000 int main(){ int a[N];int n,i,j,temp;scanf(for(i=0;i scanf( for(j=0;j for(i=0;i for(i=0;i { if(a[i]>a[i+1]){ } } temp=a[i];a[i]=a[i+1];a[i+1]=temp;} 例 #include int main(){ int i,j,m,n,a[1000];scanf(for(i=0;i for(j=0;j for(i=0;i if(a[i]>a[i+1]){ } m=a[i];a[i]=a[i+1];a[i+1]=m;}
for(i=0;i printf( return 0;} 七、计算多项式的值 题目描述 多项式 f(x)= ax3 + bx2 + cx + d 输入 输入仅一行,分别是 x,及参数 a、b、c、d 的值,每个数都是双精度浮点数。
输出 输出也仅一行,f(x)的值,保留小数点后 7 位。
样例输入 2 2 3 样例输出 提示 使用 printf(实现保留小数点后 7 位。
#include int main(){ double x,a,b,c,d,y;scanf(y=a*x*x*x+b*x*x+c*x+d;printf(return 0;} 例 #include double f(double x,double a,double b,double c,double d);int main(){ } double x,a,b,c,d,e;scanf(if(x==)printf(else { e=f(x,a,b,c,d);printf( } return 0;double f(double x,double a,double b,double c,double d){ } 八、计算两个分数的和 double e,p=,g;int i;for(i=0;i p=p*x;} g=x*x;
e=a*p+b*g+c*x+d;return e;题目描述 输入两个分数,形式如1/2,计算它们的和,以分数形式输出 输入 第一行为第一个分数第二 行 为 第 二 个 分 数 输 出 两个分数的和 样例输入 1/2 3/4 样例输出 5/4 #include int main(){ int x,y,a,b,m,n,temp,r,p,t,z;scanf( scanf( m=x*b+y*a;z=m;n=y*b;t=n;if(n { temp=n;n=m;m=temp;} while(m!=0){ r=n%m;n=m;m=r;p=n;} printf( } 九、登 山 五 一 到 了,NUIST-ACM 队组织大家去登山观光,队员们发现山上一个有 N 个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编 号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向
上走了。队员们希望在满足上面条件的同时,尽可能多的浏 览景点,你能帮他们找出最多可能浏览的景点数么? 输入 Line 1:
N(2 输出 最多能浏览的景点数 样例输入 8 186 186 150 200 160 130 197 220 样例输出 4 例 #include int f(int a[1000],int n);int main(){ return 0;int n,a[1000],i,m;scanf(for(i=0;i } { scanf(} m=f(a,n);printf(return 0;int f(int a[1000],int n){ } int i,j=1,s,m,b[1000];for(m=n;m>0;m--){ for(i=1;i if(a[i]>a[i-1]){ j++;} for(i=m-1;i if(a[i] j++;} b[n-m]=j;j=1;} s=b[0];for(i=1;i if(s s=b[i];十、计算平均年龄 例:
#include int main(){ int n,i,sum,age;double num;scanf( for(i=0,sum=0;i scanf( sum+=age;}
num=(double)sum/n;printf( return 0;} 例 #include int main(){ } 十一、数圈 以 1 为中心,用 2,3。。,n 的数字围绕着中心输出一个数圈,若 n=4 7 8 9 10 6 1 2 11 5 4 3 12 16 15 14 13 int n,m,i;float b,a=;scanf(for(i=0;i a=a+m;b=a/n;printf(return 0;输入 一 个整数 n 输 出 一个数圈 样例输入 5 样例输出 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 #include #define N 10 int main(){ int num[N][N];int circle=2,row,column,n,i=1,j;//circle 为 每转半圈的数字个数 scanf( /*确定开 始 的 那 个 1 的 位 置 */ if(n%2)row=column=n/2;else row=column=n/2-1;num[column][row]=i++;
num[column][++row]=i++;while(circle while(j { /**当circle 为奇偶数时,行的增减不一样**/ if(circle%2)num[--column][row]=i++;else num[++column][row]=i++;j++;} circle++;j=1;while(j if(circle%2)num[column][--row]=i++;else num[column][++row]=i++;j++;} } for(i=0;i for(j=0;j printf( printf( } return 0;} 十二、判断是否为闰年 #include int main(){ int year,leap;scanf( if((year%4==0 && year?0!=0)||(year@0==0))leap=1;else leap=0;if(leap)printf(else printf( return 0;} 十三、计算约数的和 给你一个数字 求它的所有约数的和。
比如 12,约数有 1,2,3,4,6,12 加起来是 28 现在给你一个数字 I。
(1
输入一个数字 I 输出约数之和样例 输 入 12 样 例 输 出 28 #include int main(){ } 十四、冒泡排序 #include #define N 5 int i,m,sum;scanf(for(i=1,sum=0;i if(m%i==0)} printf(return 0;sum+=i;? ? int main(){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;3 0 #include int main(){ int a,b,n;while(scanf( { printf( } return 0;} 十六、最大最小值 #include #define N 100 int main(){ int n,i,max,min;int a[N];scanf( for(i=0;i { scanf( } max=a[0];min=a[0];for(i=1;i } else { min=a[i];} } printf( return 0;} 十七、最 大 公约数与最小公倍数 #include int main(){ int p,r,m,n,temp;printf( scanf(
if(n temp=n;n=m;m=temp;} p=n*m;while(m!=0){ r=n%m;n=m;m=r;} printf( printf( return 0;} ?
