Problem A: 小学生的算术题
Description
Yang上小学了。他非常喜欢做算术题。他经常给妈妈出题,写出很长的连加连减的式子,让妈妈算出结果。他来进行批改,就像老师一样。
虽然Yang只上一年级,最多就会1000以内的加减法。可是这样长的式子妈妈计算起来还是很容易出错。
聪明的妈妈想了一个办法,把Yang写的式子输入到一个程序里,用程序计算出结果。这样,总能有一个正确的结果用来检查计算错误了。
那么,你来试试编写这个程序吧。
Input
输入为多行,每行一个式子。至EOF结束。
每个式子都符合“?+?-?=”的形式,其中每个“?”代表一个整数(正整数或0)。整数通常会很多,但至少可以保证一个。任意两个整数之间用“+”或“-”分隔开。“+”、“-”代表加法、减法。
无论如何,式子总是以一个整数开头,以“=”结束。可以保证式子中除了数字、“+”、“-”之外,不含有其他多余的符号。
这些整数都很小,运算不会超出int范围。
Output
输出这个式子的运算结果,每个一行。
Sample Input
1-2+3-4+5-6+7-8+9=
1-2+3-4+5-6+7-8=
5-1-1+0-1-1-1=
10=
Sample Output
5
-4
0
10
简单计算,边输入边判断边计算即可
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
int ans=0;
char c;
while(~scanf("%d",&n)){
ans=0;
ans+=n;
while(scanf("%c",&c)){
if(c=='+'){
scanf("%d",&n);
ans+=n;
}
else if(c=='-'){
scanf("%d",&n);
ans-=n;
}
else if(c=='='){
printf("%d\n",ans);
break;
}
}
}
return 0;
}
Problem B: 递归求组合数
Input
输入为两个正整数n和k。输入不保证k≤n。满足n,k≤25。
Output
输出一个整数:从n个不同元素中取出k个元素的组合数。
Sample Input
5 3
Sample Output
10
#include<stdio.h>
int C(int n,int k){
if(k>n||n==0) return 0;
else if(k==n) return 1;
else if(k==1) return n;
else return C(n-1,k-1)+C(n-1,k);
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
printf("%d",C(n,k));
return 0;
}
Problem C: 编写函数:笛卡尔坐标系(Append Code)
Input
输入为一行。输入的坐标x、y值都会带有1位小数,括号和逗号都是英文半角符号,逗号后面有一个空格。
Output
四个象限输出为“quadrand I”、“quadrand II”、“quadrand III”、“quadrand IV”,x-轴和y-轴输出为“x axis”和“y axis”,原点输出为“origin”
输出为以下三种:
(-1.0, -2.5) is in quadrand III
(0.0, 4.8) is on the y axis
(0.0, 0.0) is origin
Sample Input
(-1.0, -2.5)
Sample Output
(-1.0, -2.5) is in quadrand III
Append Code
int main()
{
struct point p;
get_point(&p);
judge_point(p);
return 0;
}
#include<stdio.h>
struct point{
double x,y;
};
void get_point(struct point *p){
scanf("(%lf, %lf)",&p->x,&p->y);
}
void judge_point(struct point p){
if(p.x>0 && p.y>0){
printf("(%.1lf, %.1lf) is in quadrand I\n",p.x,p.y);
return ;
}
if(p.x<0 && p.y>0){
printf("(%.1lf, %.1lf) is in quadrand II\n",p.x,p.y);
return ;
}
if(p.x<0 && p.y<0){
printf("(%.1lf, %.1lf) is in quadrand III\n",p.x,p.y);
return ;
}
if(p.x>0 && p.y<0){
printf("(%.1lf, %.1lf) is in quadrand IV\n",p.x,p.y);
return ;
}
if(p.x==0 && p.y!=0){
printf("(%.1lf, %.1lf) is on the y axis\n",p.x,p.y);
return ;
}
if(p.x!=0 && p.y==0){
printf("(%.1lf, %.1lf) is on the x axis\n",p.x,p.y);
return ;
}
if(p.x==0 && p.y==0){
printf("(%.1lf, %.1lf) is origin\n",p.x,p.y);
return ;
}
}
自己代码一直wronganswer89%,很迷
#include <stdio.h>
struct point{
double x;
double y;
};
//按照格式输入一个点,用传地址的方法。
void get_point(struct point *p)
{
scanf("(%lf, %lf)",&p->x,&p->y);
}
//判断点位于哪个象限或哪个坐标轴上,或者是原点,按照格式输出结果。
void judge_point(struct point p){
if(p.x>0&&p.y>0){
printf("(%.1lf, %.1lf) is in quadrand I\n",p.x,p.y);
}else if(p.x<0&&p.y>0){
printf("(%.1lf, %.1lf) is in quadrand II\n",p.x,p.y);
}else if(p.x<0&&p.y<0){
printf("(%.1lf, %.1lf) is in quadrand III\n",p.x,p.y);
}else if(p.x<0&&p.y>0){
printf("(%.1lf, %.1lf) is in quadrand IV\n",p.x,p.y);
}else if(p.x==0&&p.y!=0){
printf("(%.1lf, %.1lf) is on the y axis\n",p.x,p.y);
}else if(p.y==0&&p.x!=0){
printf("(%.1lf, %.1lf) is on the x axis\n",p.x,p.y);
}else if(p.x==0&&p.y==0){
printf("(%.1lf, %.1lf) is origin\n",p.x,p.y);
}
return ;
}
Problem D: 编写函数:数组的操作 之一(Append Code)
Input
有M(M<50)组测试样例。每组样例包含两个数组,每个数组以一个非负整数N(N<=1000)开始,后接N个整数。
Output
每组测试样例的两个数组对应元素相加,元素多的那个数组视作加0,得到一个新的数组,并输出在一行,元素之间用一个空格分开,行尾不要有多余的空格。
Sample Input
3
5 1 2 3 4 5
4 -1 -2 -3 -4
4 1 2 3 4
5 -1 -2 -3 -4 -5
5 1 2 3 4 5
5 -1 -2 -3 -4 -5
Sample Output
0 0 0 0 5
0 0 0 0 -5
0 0 0 0 0
Append Code
int get_array(int a[])
{
int n, i;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
return n;
}
int put_array(int a[], int n)
{
int i;
if(n > 0)
printf("%d", a[0]);
for(i = 1; i < n; i++)
printf(" %d", a[i]);
printf("\n");
return 0;
}
int main()
{
int cases;
int m, n, k,arr[1000], ar[1000], a[1000];
scanf("%d", &cases);
while(cases--)
{
m = get_array(a);
n = get_array(ar);
k = add_array(arr, ar, n, a, m);
put_array(arr, k);
}
return 0;
}
认真审题,注意还要返回长的数组的长度
#include<stdlib.h>
#include<stdio.h>
//把a[]的元素和b[]的元素按下标对应相加,放入arr[]里,其中m、n是数组a[]、b[]的长度,
//a[]或b[]中较长的数组多出来的元素视作加0,返回值是较长的数组的元素个数。
int add_array(int arr[], int a[], int m, int b[], int n)
{
int i,j,x=0;
if(m>n){
for(i=0;i<n;i++){
arr[i]=a[i]+b[i];
}
for(i=n;i<m;i++){
arr[i]=x+a[i];
}
x=m;
}
else if(m<n){
for(i=0;i<m;i++){
arr[i]=a[i]+b[i];
}
for(i=m;i<n;i++){
arr[i]=x+b[i];
}
x=n;
}
else{
for(i=0;i<m;i++){
arr[i]=a[i]+b[i];
}
x=m;
}
return x;
}
Problem E: 编写函数:转换大小写(Append Code)
Input
输入一个字符c,可以保证c必为一个字母。
Output
输出也是一个字符,c为大写字母,则输出对应的小写字母,反之亦然。
Sample Input
A
Sample Output
a
Append Code
int main()
{
char ch;
ch = getchar();
ch = cnvchar(ch);
putchar(ch);
return 0;
}
没什么难的,就是注意转换后要接着return
#include<stdio.h>
//若c是一个大写字母,转换为对应的小写字母,反之亦然。
char cnvchar(char c){
if(c>='a'&&c<='z'){
c-=32;
return c;
}
if(c>='A'&&c<='Z'){
c+=32;
return c;
}
}
Problem F: 重要的事情说三遍
Description
哈哈,都说重要的事情说三遍。好吧,这次你来编写一个程序解决这个问题。
Input
输入是“重要的事情说三遍”。
Output
输出是“重要的事情”,重复三次。
Sample Input
重要的事情说三遍
Sample Output
重要的事情重要的事情重要的事情
看了一眼别人的代码,好家伙直接输入输出
#include <stdio.h>
int main()
{
scanf("重要的事情说三遍");
printf("重要的事情重要的事情重要的事情");
return 0;
}
ans:
#include<stdio.h>
int main()
{
char a[10];
gets(a);
int n=3;
while(n-->0){
printf("重要的事情");
}
return 0;
}
Problem G: 内存单位换算
Input
输入为一个整数,表示内存中n个字节,0<=n<232。
Output
输出三行:第一行为KB数,不足K的舍去;第二行为MB数、第三行为GB数,均保留两位小数。
Sample Input
4294967295
Sample Output
4194303K
4096.00M
4.00G
#include<stdio.h>
int main(){
unsigned long long a,b;
scanf("%llu",&a);
b=a/1024;
printf("%dK\n",b);
double c,d;
c=(double)a/1024/1024;//直接对a进行运算,不要写成c=(double)b/1024;
d=(double)a/1024/1024/1024;
printf("%.2lfM\n",c);
printf("%.2lfG\n",d);
return 0;
}
Problem H: 查询单词
Description
对一个给定的单词(words)序列,给出若干查询关键字(keyword),判断每个关键字是否在序列中。
Input
输入分两部分。第一部分首先是一个正整数N(N<=1000),后接N个字符串,用空格分开。第二部分是若干不含空格(或空白符)的字符串,每个字符串一行,至EOF结束。每个字符串均不超过100个字符。
Output
若第二部分的字符串与第一部分的某个字符串完全相同,则输出“Yes”,否则输出“No”
Sample Input
6
Shandong University of Science and Technology
Shan
Dong
Univerisity
of
Scienc
AND
Technology
Sample Output
No
No
No
Yes
No
No
Yes
用strcmp判断字符串是否相同
#include<stdio.h>
#include<string.h>
int main(){
int n,i;
scanf("%d",&n);
char a[1001][101];
for(i=0;i<n;i++){
scanf("%s",a[i]);
}
char b[101];
while(scanf("%s",b)!=EOF){
int flag=0;
for(i=0;i<n;i++){
if(strcmp(a[i],b)==0){
flag=1;
printf("Yes\n");
break;
}
}
if(!flag)//循环完之后仍未找到
printf("No\n");
}
return 0;
}
Problem I: 亏本了吗?
Description
有一家公司,财务把今年的收支表做出来了,总经理请人编写一个程序算一算,今年是否亏本了?
公司的收支表中有一列是金额。这一列的第一行是公司上年的结余(不算作收入或支出)。后面每行的数据都代表一笔收入或支出。依照会计记账规定,应该是收入记为+,支出记为-。比如,收入10元,应该计入+10,支出10元,应该计入-10。但是粗心的会计有时会把+漏掉了,也就是收入10元,有可能记为+10,也有可能记为10,但绝不会是-10。
你来试一试,能解决这个问题吗?
Input
输入有多行,每行一个整数,至EOF结束。第一个整数是上年的结余,后面每行一个整数,整数前有可能有+或-。整数前标记为-的为支出,标记为+或不标记的为收入。
输入可以保证至少会有一个整数。所有的运算都在int范围内。
Output
若公司今年亏本(收入小于支出)则输出“Yes”,否则输出“No”。
Sample Input
10
5
+5
-10
Sample Output
No
好家伙,scanf输入时已经将±符号自动变为正负号了,那这就不是问题了
注意第一个整数是上一年的结余,不用计算在内
#include<stdio.h>
int main(){
int a,n,sum=0;
scanf("%d",&a);
while(~scanf("%d",&n)){
sum+=n;
}
if(sum>=0) printf("No");
else printf("Yes");
return 0;
}
Problem J: 坏了哪些键
Description
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
Input
输入为多行,第一行给出应该输入的文字,后面的各行是实际被输入的文字。
每段文字是不超过30000个字符的串,用字母A-Z(大小写)、数字0-9、以及下划线组成。
题目保证输入的字符串均非空。
Output
每段实际被输入的文字,对应一行输出:按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出1次。
题目保证至少有一个坏键。下划线不会是坏键。
Sample Input
7_This_is_a_test
7_This_is__test
_hs_s_a_es
Sample Output
A
7TI
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30001
int f(char x,int n);
char a[MAX];//应输入文字
char b[MAX];//实际输入文字
char c[MAX];//记录所有缺的键
int main()
{
scanf("%s",a);//给出应该输入的文字
int i,k;
while(scanf("%s",b)!=EOF){
int n=0;
i=0;k=0;
while(1)
{
if(a[i]==0) break;
if(a[i]=='_') {++i;continue;}
if(b[k]=='_') {++k;continue;}
if(a[i]==b[k]) {++i;++k;continue;}
if(a[i]!=b[k])
{
char x;
if(a[i]>='a'&&a[i]<='z') x=a[i]-'a'+'A';
else x=a[i];
if(f(x,n))
{
c[n]=x;
++n;
}
++i;
}
}
int j;
for(j=0;j<n;++j) printf("%c",c[j]);
puts("");
}
return 0;
}
int f(char x,int n)
{
int i;
for(i=0;i<n;++i)
{
if(x==c[i]) return 0;
}
return 1;
}
Problem K: 稳定的排序
Input
输入为N(N<50)测试样例。每组测试样例以一个正整数M(M<=100)开头,后接M个待排序的浮点数。
Output
每组测试样例对应输出一行,按浮点数的整数部分排序,但整数部分相同小数部分不同的浮点数,先后顺序不变。
所有浮点数输出保留一位小数,用一个空格分开,行尾不要有多余的空格。
Sample Input
3
10
1.6 1.7 1.8 2.1 2.2 2.3 2.4 2.5 5.9 6.0
10
6.0 5.9 2.5 2.4 2.3 2.2 2.1 1.8 1.7 1.6
10
2.2 2.4 1.8 5.9 1.6 2.5 2.1 6.0 1.7 2.3
Sample Output
1.6 1.7 1.8 2.1 2.2 2.3 2.4 2.5 5.9 6.0
1.8 1.7 1.6 2.5 2.4 2.3 2.2 2.1 5.9 6.0
1.8 1.6 1.7 2.2 2.4 2.5 2.1 2.3 5.9 6.0
按浮点数的整数部分排序,但整数部分相同小数部分不同的浮点数,先后顺序不变。
float AC不了,double 能AC ,看来以后浮点数的话还是用double的好
#include<stdio.h>
int main(){
int n,m,i,j;
scanf("%d",&n);
double a[101];
while(n-->0){
scanf("%d",&m);
for(j=0;j<m;j++){
scanf("%lf",&a[j]);
}
//冒泡排序
for(i=0;i<m-1;i++){
for(j=0;j<m-i-1;j++){
if((int)a[j+1]<(int)a[j]){
double t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
for(i=0;i<m;i++){
if(i) printf(" %.1lf",a[i]);
else printf("%.1lf",a[i]);
}
printf("\n");
}
return 0;
}
Problem L: 判断奇偶数
Description
判断一个正整数是奇数还是偶数?
Input
输入有多行,至EOF结束。每行一个正整数n,n<=101000。
Output
输出有多行,每一行输出与输入的n对应,n为偶数输出“Even”,n为奇数输出“Odd”。
Sample Input
123
1234
Sample Output
Odd
Even
10^1000太大了,只能用字符数组来存了
小技巧:判断奇偶数只需判断最后一位是奇数还是偶数即可
#include<stdio.h>
#include<string.h>
void judge(char *n){
int len=strlen(n);
int a=n[len-1]-'0';
if(a%2!=0){
printf("Odd\n");
}
else{
printf("Even\n");
}
}
int main(){
char n[1001];
while(gets(n)!=NULL){
judge(n);
}
return 0;
}