2016级计算机学院《程序设计基础(1)》

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值