算法竞赛入门经典,练习代码 ,3.4.9 上机练习
2016-01-31 10:42
701 查看
习题3-1 分数统计(stat)
输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。
任务1:分数均不超过100的非负整数
任务2:分数均不超过100的非负实数,但最多保留两位小数。
习题3-2 单词的长度(word)
输入若干个单词,输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开。
习题3-3 乘积的末3位
输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末3位。这些整数中会混入一些由大写字母组成的字符串,你的程序应该忽略它们。提示:试试看,在执行scanf("%d")时输入一个字符串会怎样?
习题3-4
编程程序读入一行恰好包括一个+或-或*的表达式,输出它的值。运算符保证是二元运算符,且两个运算数均不超过100的非负整数。运算数和运算符可以紧挨也可以有一个或多个空格、TAB隔开。行首尾均可以有空格。提示:选择合适的输入方法可以将问题简化。
习题3-5 旋转
输入一个n*n字符矩阵,把它左旋90度后输出
习题3-6 进制转换1
输出基数b( 2 <= b <= 10)和正整数n(十进制),输出n的b进制表示
递归版本:
习题3-7 进制转换2
输出基数b( 2 <= b <= 10)和正整数n(b进制),输出n的十进制表示
习题3-8 手机键盘
输入一个有小写字母组成的英文单词,输入用手机的默认英文输入法的键盘序列。例pig,需按1次p,3次i,1次g,记为p1i3g1.
输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。
任务1:分数均不超过100的非负整数
任务2:分数均不超过100的非负实数,但最多保留两位小数。
#include <stdio.h> #define MAX=1000 int main() { int a[101]; int x,i; memset(a,0,sizeof(a));//memset第三个参数是数组的大小,不是个数 while(scanf("%d",&x)!=EOF) a[x]++; int max=0; for(i=0;i<=100;i++) if(a[i]>=max) { max=a[i]; } for(i=0;i<=100;i++) if(a[i]==max) { printf("%d\n",i); } return 0; }
#include <stdio.h> #include <math.h> int main() { int a[10010]={0};//可直接全部赋值 int i; double x; // double k; int max=-1; // memset(a,0,sizeof(a));//memset第三个参数是数组的大小,不是个数 int n=0;//存放最大输入的数*100 int y;//存x*100 while(scanf("%lf",&x)!=EOF) { y=(int)floor(x*100); a[y]++;//floor向下取整,不然double型运算可能不正确 if(a[y]>=max) { max=a[y]; } if(n<=y) n=y; } //printf("%d\n",max); for(i=0;i<=n;i++) if(a[i]==max) { //k=i/100+i%100/10*0.1+i%100%10*0.01;//一定要用一个double类型接收,不能直接输出,那样不能类型转换 printf("%.2lf\n",(double)i/100 );//转化类型后可输出 } return 0; }
习题3-2 单词的长度(word)
输入若干个单词,输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开。
#include <stdio.h> #define MAX 1000 int main() { char a[MAX]; int i,count=0,flag=1,n=0; double x; gets(a); for(i=0;i<strlen(a);i++) { if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')) { count++; if(flag==1) { n++; flag=0; } } else{ flag=1; } } //printf("%d %d\n",count,n); x=1.0*count/n; printf("%lf\n",x); return 0; }
习题3-3 乘积的末3位
输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末3位。这些整数中会混入一些由大写字母组成的字符串,你的程序应该忽略它们。提示:试试看,在执行scanf("%d")时输入一个字符串会怎样?
scanf("%d",&a); 这语句只从输入缓冲区接收数字,输入字符时就不会接收,输入的字符永远在缓冲区内。
#include<stdio.h> int main() { int a=0; long long ans=1; char c; while((c=getchar())!=EOF) { if(isdigit(c)) a=a*10+c-'0'; else if(c==' ') { ans*=a; a=0; } if(ans==0) break; } ans*=a; printf("%3lld\n",ans%1000); return 0; }
习题3-4
编程程序读入一行恰好包括一个+或-或*的表达式,输出它的值。运算符保证是二元运算符,且两个运算数均不超过100的非负整数。运算数和运算符可以紧挨也可以有一个或多个空格、TAB隔开。行首尾均可以有空格。提示:选择合适的输入方法可以将问题简化。
#include<stdio.h> int main() { int a=0,b=0,out; char c; scanf("%d",&a); c=getchar(); while(c!='+'&&c!='-'&&c!='*') { c=getchar(); } scanf("%d",&b); if(c=='+')out=a+b; else if(c=='-')out=a-b; else if(c=='*')out=a*b; printf("%d\n",out); return 0; }
#include <stdio.h> #define N 1000 char str ; int main(void) { char *p = NULL; int op1, op2; fgets(str, sizeof(str), stdin);//it will contains '\n'; for (p = str; *p != '\n'; p++) { if (*p == '+' || *p == '-' || *p == '*') break; } if (*p != '\n'){ switch(*p) { case '+': sscanf(str, "%d + %d", &op1, &op2);// <span style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 21px;">sscanf() - 从一个字符串中读进与指定格式相符的数据.</span> printf("%d\n", op1+op2); break; case '-': sscanf(str, "%d - %d", &op1, &op2); printf("%d\n", op1-op2); break; case '*': sscanf(str, "%d * %d", &op1, &op2); printf("%d\n", op1*op2); break; } } return 0; }注意"%d + %d"这个+号两边必须有空格才会吃掉诸如3 +1这种情况
习题3-5 旋转
输入一个n*n字符矩阵,把它左旋90度后输出
#include <stdio.h> #define MAX 100 int main() { char a[MAX][MAX]; int i=0,j=0,n=0; char c; do { n=0; while((c=getchar())!='\n') { a[i][j]=c; n++; j++; } i++; j=0; } while(i<n); for(i=(n-1);i>=0;i--) { for(j=0;j<n;j++) printf("%c",a[j][i]); printf("\n"); } }
getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。 实际上是 输入设备->内存缓冲区->程序getchar
习题3-6 进制转换1
输出基数b( 2 <= b <= 10)和正整数n(十进制),输出n的b进制表示
#include <stdio.h> int main() { int b,n,i=0; int a[100]; scanf("%d %d",&b,&n); do{ a[i]=n%b; n=n/b; i++; } while(n>0); i--; while(i>=0) { printf("%d",a[i]); i--; } printf("\n"); }
递归版本:
#include <stdio.h> void trans(int n, int b) { if (n >= b) trans(n/b, b); printf("%d", n%b); } int main(void) { int b, n; scanf("%d %d", &b, &n); trans(n, b); printf("\n"); return 0; }
习题3-7 进制转换2
输出基数b( 2 <= b <= 10)和正整数n(b进制),输出n的十进制表示
#include <stdio.h> #include <math.h> int main() { int b,i=0,x,out=0; char n[100]; scanf("%d %s",&b,&n); x=strlen(n); for(i=0;i<x;i++) { out=out+(n[i]-'0')*pow(b,x-i-1) ; } printf("%d\n",out); }
习题3-8 手机键盘
输入一个有小写字母组成的英文单词,输入用手机的默认英文输入法的键盘序列。例pig,需按1次p,3次i,1次g,记为p1i3g1.
#include <stdio.h> #include <math.h> int main() { char a[8][4]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; char c; int i,j; while((c=getchar())!='\n') { for(i=0;i<8;i++) for(j=0;j<4;j++) { if(c==a[i][j]) printf("%c%d",c,j+1); } } printf("\n"); return 0; }
相关文章推荐
- springMVC之多方法访问
- c# 6.0新特性(二)
- C++ 程序设计 week 5 继承和派生
- 搭建github博客
- Java并发编程:深入剖析ThreadLocal
- 最近准备把安卓和java的知识再回顾一遍,顺便会写博客上!千变万化还都是源于基础,打扎实基础
- 函数式编程语言彻解彻悟
- springMVC之环境搭建
- Facebook 将关闭 Parse 服务,并将其代码开源
- Django-blog-zinnia初体验(一)
- java定时任务代理配置
- DTP中写例程 取前7日和前1日
- C++11:右值引用和转发型引用
- 固定内存块尺寸的内存池原理及代码
- c++读取文件目录
- PHP常量详解:define和const的区别
- Spring缓存注解@Cache使用
- 使用PHP导入和导出CSV文件
- JavaDoc的生成规则---ShinePans
- Pyhton 第九章 正则表达式