安工 pta 计算机导论作业(C语言)

练习1:

1-1 计算某天距元旦的天数

输入年、月、日,要求输出该年份的元旦到该日期总共经过了多少天。(提示:闰年是指能被400 整除的年份或者能被4 整除但不能100 整除的年份)

输入格式:

输入n,代表接下来要输入n行的年、月、日。

然后输入n行年、月、日,年、月、日之间的元素以空格相分隔,第1个数据为年,第2个数据为月,第3个数据为日。

输出格式:

如果输入年月日正确,则输出:Totaldays=天数

如果输入年月日有错,则输出:ErrorInput

输入样例:

4
2000 13 10
2001 3 10
2012 3 10
2018 5 20

输出样例:

ErrorInput
Totaldays= 69
Totaldays= 70
Totaldays= 140

答案:

#include<stdio.h>
int main(){
	int x;
	scanf("%d",&x);
	int i,j,k;
	int y,m,d;
	int r[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	int p[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int n=0;
	for(i=0;i<x;i++)
	{
		scanf("%d %d %d",&y,&m,&d);
		if(m>12||y<0||m<=0||d>31||d<0)
		{
			printf("ErrorInput\n");
		}
		else
		{
			if((y%4==0&&y%100!=0)||y%400==0)
			{
				for(j=0;j<m-1;j++)
				{
					n+=r[j];
				}
				n+=d;
			}
			else
			{
				for(j=0;j<m-1;j++)
				{
					n+=p[j];
				}
				n+=d;
			}
			printf("Totaldays= %d\n",n);
		}
		
		n=0;
	}
	
	return 0;
}


/*#include<stdio.h>
int main(){
    int n,year,month,day;
    scanf("%d",&n);
    int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    for(int i=0;i<n;i++){
        int Totaldays=0;
        scanf("%d %d %d",&year,&month,&day);
        if((month<=12 && month>0) && (day<=a[month-1] && day>0)){
            if((year%400==0) || ((year%4==0) && (year%100!=0))){
                for(int j=0;j<month-1;j++){
                    Totaldays+=a[j];
                }
                if(month>2){
                    printf("Totaldays= %d",Totaldays+day+1);
                }
                else{
                    printf("Totaldays= %d",Totaldays+day);
                }
            }
            else{
                for(int j=0;j<month-1;j++){
                    Totaldays+=a[j];
                }
                printf("Totaldays= %d",Totaldays+day);
            }
        }
        else{
            printf("ErrorInput");
        }
        if(i<n-1){
            printf("\n");
        }
    }
    return 0;
}*/

1-2 小游戏

有一个小游戏,6个人上台去算手中扑克牌点数之和是否5的倍数,据说是小学生玩的。这里稍微修改一下玩法,n个人上台,算手中数字之和是否同时是5,7,3的倍数。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入1个整数n(1≤n≤15),再输入n个整数,每个都小于1000。

输出格式:

对于每组测试,若n个整数之和同时是5,7,3的倍数则输出YES,否则输出NO

输入样例:

2
3 123 27 60
3 23 27 60

输出样例:

YES
NO

答案:

#include<stdio.h>
int main(){
    int n,m;
    scanf("%d",&n);
    int arr[n][15],i,j;
    for(i=0;i<n;i++){
        scanf("%d ",&m);
        int sum=0;
        for(j=0;j<m;j++){
            scanf("%d",&arr[i][j]);
            sum+=arr[i][j];
        }
        if(sum%3==0 && sum%5==0 && sum%7==0){
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
    return 0;
}

1-3 zust-sy5-13虫子吃苹果后,还剩下几个完整苹果

你买了一箱n个苹果,很不幸的是买来的时候,箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果?

输入格式:

一行中给出n,x和y(均为整数),其间以逗号间隔。

输出格式:

一行中输出剩下的苹果数(完整的苹果数)。

输入样例1:

10,4,9

输出样例1:

7

输入样例2:

5,4,20

输出样例2:

0

答案:

#include<stdio.h>
int main(){
    int n,x,y;
    scanf("%d,%d,%d",&n,&x,&y);
    int c;
    if(y%x!=0)
        c=y/x+1;
    else
        c=y/x;
    if(n>c)
        printf("%d\n",n-c);
    else
        printf("0\n");
    return 0;
}

1-4 jmu-python-素数

输入一个数,判断其是否素数。素数是大于1的自然数中,除了1和它本身以外不再有其他因数。

输入格式:

输入一个整数

输出格式:

输出是否素数。

输入样例:

12

输出样例:

12 is not prime

输入样例:

7

输出样例:

7 is prime

答案:

#include<stdio.h>
#include<math.h>

int prime_number(int n){
    if(n==1)
        return 0;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0)
            return 0;
    }
    return 1;
}

int main(){
    int n;
    scanf("%d",&n);
    if(prime_number(n)){
        printf("%d is prime\n",n);
    }
    else
        printf("%d is not prime\n",n);
    return 0;
}

练习2:

2-1 超速处罚[加测试数据]

按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。

输入格式:

输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。

输出格式:

在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。

输入样例1:

65 60

输出样例1:

OK

输入样例2:

110 100

输出样例2:

Exceed 10%. Ticket 200

输入样例3:

200 120

输出样例3:

Exceed 67%. License Revoked

答案:

#include<stdio.h>
#include<math.h>
int main(){
    double v,s;
    scanf("%lf %lf",&v,&s);
    double x=(v-s)/s;
    if(v<s+s/10){
        printf("OK");
    }
    else if(v<s+s/2){
        printf("Exceed %.0lf%%. Ticket 200",round(x*100));
    }
    else{
        printf("Exceed %.0lf%%. License Revoked",round(x*100));
    }
    return 0;
}

2-2 成绩百分与五分制的转换

输入百分成绩,输出五分制等级。转换规则如下:100~90等级A,89~80等级B,79~70等级C,69~60等级D,小于60等级E,如果输入的成绩在0--100范围之外,则输出”输入错误“。

输入格式:

输入一个正整数,在0--100之间。
注意:

  1. 输入使用input(),不要增加额外的提示信息

  2. input 函数返回值是字符串, 可以使用 int(input()) 或 eval(input()) 来进行转换

输出格式:

直接输出A、B、C、D、E其中的一个,或者”输入错误“。

输入样例1:

98

输出样例1:

A

输入样例2:

103

输出样例2:

输入错误

答案:

#include<stdio.h>
int main(){
    int a;
    scanf("%d",&a);
    if(a>=90 && a<=100){
        printf("A");
    }
    if(a>=80 && a<90){
        printf("B");
    }
    if(a>=70 && a<80){
        printf("C");
    }
    if(a>=60 && a<70){
        printf("D");
    }
    if(a>=0 && a<60){
        printf("E");
    }
    if(a>100 || a<0){
        printf("输入错误");
    }
    return 0;
}

2-3 温度转化

温度刻画存在不同体系,摄氏度以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画。华氏度以1标准大气压下水的结冰点为32度,沸点为212度,将温度进行等分刻画。
根据华氏和摄氏温度定义,转换公式如下:
C = ( F – 32 ) / 1.8
F = C * 1.8 + 32
注意:结果保留两位小数

输入样例1:

F67

输出样例1:

C19.44

输入样例2:

55

输出样例2:

输入格式错误

答案:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define INT_MAX 100
int main(){
    char a[INT_MAX];
    double num=0,sum=0,f,c;
    scanf("%s",&a);
    int az=strlen(a);
    for(int i=1;i<strlen(a);i++){
        double num=(a[i]-'0')*pow(10,az-2);
        sum+=(int)num;
        az--;
    }
    if(a[0]=='F'){
        c=(sum-32)/1.8;
        printf("C%.2lf",c);
    }
    else if(a[0]=='C'){
        f=sum*1.8+32;
        printf("F%.2lf",f);
    }
    else{
        printf("输入格式错误");
    }
    return 0;
}

2-4 指定范围内的素数

编程实现输出指定范围内的素数,素数之间以空格间隔。指定范围由用户输入指定。

输入格式:

输入两个整数a,b(系统保证这两个整数大于等于2,小于等于10000,且a<=b),用逗号间隔。

输出格式:

输出[a,b]所有素数,素数之间用一个空格间隔。

输入样例:

100,150

输出样例:

101 103 107 109 113 127 131 137 139 149 

答案:

#include<stdio.h>
int main(){
    int m,n,i,j;
    scanf("%d,%d",&m,&n);
    for(i=m;i<=n;i++){
        for(j=2;j<=n;j++){
            if(i%j==0){
                break;
            }
        }
        if(i==j){
            printf("%d ",i);
        }
    }
    return 0;
}

练习3:

3-1 输出指定位数的最小斐波纳契数

斐波那契数,亦称之为斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……,这个数列从第3项开始,每一项都等于前两项之和。求指定位数的最小斐波那契数。

输入格式:

输人一个整数n(n>1)。

输出格式:

输出斐波纳契数列中,最小的n位数。

输入样例1:

在这里给出一组输入。例如:

2

输出样例1:

在这里给出相应的输出。例如:

13

输入样例2:

在这里给出一组输入。例如:

5

输出样例2:

在这里给出相应的输出。例如:

10946

答案:

#include<stdio.h>
#include<math.h>

int main(){
    int n;
    scanf("%d",&n);
    int i=0,arr[10000];
    for(i=2;i<10000;i++){
        arr[0]=1,arr[1]=1;
        arr[i]=arr[i-1]+arr[i-2];
        if(arr[i]>pow(10,n-1) && arr[i]%(int)pow(10,n)==arr[i]){
            printf("%d",arr[i]);
            break;
        }
    }
    return 0;
}

3-2 找完数

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

(提示:输出结果的‘=’和‘+’前后都有一个空格)

输入样例:

在这里给出一组输入。例如:

2 30

输出样例:

在这里给出相应的输出。例如:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

答案:

#include<stdio.h>
#include<math.h>
int main(){
    int m,n;
    int i,j,k;
    int s,p,flag=0;
    scanf("%d %d",&m,&n);
    for(i=m;i<=n;i++){
        s=0;
        for(j=1;j<=i/2;j++){
            if(i%j==0)
                s+=j;
        }
        if(s==i){
            flag=1;
            printf("%d = ",i);
            p=0;
            for(j=1;j<=i/2;j++){
                if(i%j==0){
                    p+=j;
                    if(p!=i)
                        printf("%d + ",j);
                    else
                        printf("%d\n",j);
                }
            }
        }
    }
    if(flag==0)
        printf("None\n");
    return 0;
}

3-3 计算“厉害数”

所谓“厉害”数,是指其各位数字的5次方等于该数本身。
编程输出所有长度不超过n位的正整数中的“厉害”数。
例如:4151=4**5 +1**5 +5**5 +1**5

输入格式:

一个整数n (1<=n<=6),n为位数

输出格式:

每行输出一个“厉害”数

输入样例:

4

输出样例:

1
4150
4151

答案:

#include<stdio.h>
#include<math.h>
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=pow(10,n);i++){
        int sum=0,num=0,temp=i;
        for(int j=0;j<n;j++){
            num=temp%10;
            sum+=pow(num,5);
            temp/=10;
        }
        if(sum==i){
            printf("%d\n",i);
        }
    }
    return 0;
}

3-4 求所有N位的素数和

输入一个正整数n(n>=2),输出所有n位的素数和,如n=2,即输出的是10-99之间的所有素数的和。

输入格式:

一个正整数n(n>=2)

输出格式:

输出所有n位的素数和

输入样例:

2

输出样例:

10-99之间所有的素数和=1043

答案:

#include<stdio.h>
#include<math.h>
int main(){
    int n;
    scanf("%d",&n);
    int sum=0,i,j;
    int min=pow(10,n-1),max=pow(10,n)-1;
    for(i=min;i<=max;i++){
            int flog=1;
        for(j=2;j<=sqrt(i);j++){
            if(i%j==0){
                flog=0;
                break;
            }
        }
        if(flog==1){
            sum+=i;
        }
    }
    printf("%d-%d之间所有的素数和=%d",min,max,sum);
    return 0;
}

练习4:

4-1 折纸问题

一张纸厚0.2mm, 问至少对折多少次后,纸的厚度超过珠穆朗玛峰(8848m)

输出格式:

折叠次数=26
折叠后厚度=13421.77

输入样例:

输出样例:

在这里给出相应的输出。例如:

折叠次数=26
折叠后厚度=13421.77

答案:

#include<stdio.h>
int main(){
    double thickness=0.2/1000;
    for(int i=1;;i++){
        thickness*=2;
        if(thickness>=8848){
            printf("折叠次数=%d\n",i);
            printf("折叠后厚度=%.2lf",thickness);
            break;
        }
    }
    return 0;
}

4-2 考拉兹猜想

考拉兹猜想(Collatz conjecture)又称奇偶归一猜想,是指对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2。 如此循环,最终都能得到1。编写一个程序,输入一个正整数,打印其考拉兹序列。

输入格式:

1个>1的正整数

输出格式:

以空格分隔的考拉兹序列。

输入样例:

在这里给出一组输入。例如:

5

输出样例:

在这里给出相应的输出。例如:

16 8 4 2 1 

答案:

#include<stdio.h>
int main(){
    int num;
    scanf("%d",&num);
    while(num!=1){
        if(num%2==1){
            num=num*3+1;
            printf("%d ",num);
        }
        else{
            num/=2;
            printf("%d ",num);
        }
    }
    return 0;
}

4-3 猜数游戏

猜数字游戏编程:计算机随机产生一个0~100以内的正整数,用户输入一个数对其进行猜测,程序对其与随机产生的被猜数进行比较,并提示大了(“Too big”)、小了(“Too small”),还是相等(“Lucky You!”)。如果猜到,则结束程序。如果超过8次都没有猜到,则提示“Game Over!”,并结束程序。如下图:

捕获.PNG

提示:随机因子seed设置为1(防止调试错误)

输入格式:

每行给出一个用户的输入,直到猜中或者超过8次还没有猜中。

输出格式:

每次在一行中输出相应的猜测结果,直到输出猜对的结果“Lucky You!”或“Game Over!”则结束。

输入样例:

56
25
12
20
16
18
17

输出样例:

在这里给出相应的输出。例如:

Too big
Too big
Too small
Too big
Too small
Too big
Lucky You!

答案:

//应对本题
#include<stdio.h>
int main(){
    int random_number=17;
    int frequency=8,guess;
    while(frequency>0){
        scanf("%d",&guess);
        if(guess>random_number){
            printf("Too big\n");
        }
        else if(guess==random_number){
            printf("Lucky You!");
            break;
        }
        else{
            printf("Too small\n");
        }
        frequency--;
    }
    if(frequency==0){
        printf("Game Over!");
    }
    return 0;
}


//真正的猜数字
/*#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(){
    srand((unsigned int)time(NULL));
    int random_number=rand()%100;
    int frequency=8,guess;
    while(frequency>0){
        scanf("%d",&guess);
        if(guess>random_number){
            printf("Too big\n");
        }
        else if(guess==random_number){
            printf("Lucky You!\n");
            break;
        }
        else{
            printf("Too small\n");
        }
        frequency--;
    }
    if(frequency==0){
        printf("Game Over!\n");
    }
    return 0;
}*/

4-4 计算三角形面积

输入三角形三条边,先判断是否可以构成三角形,如果可以,则求出三角形的周长和面积并输出,否则报错:“无法构成三角形!”
提示(1)构成三角形条件:每条边均大于0,并且任意两边之和大于第三边。
(2)三角形面积
 

sanjiaoxing.png


,h是三角形周长的一半。

输入格式:

一行中输入三个数

输出格式:

如果可以构成三角形,输出三角形面积,保留2位小数。如果不能构成三角形,则输出“无法构成三角形!”

输入样例1:

3,4,5

输出样例1:

6.00

输入样例2:

4,8,3

输出样例2:

无法构成三角形!

答案:

#include<stdio.h>
#include<math.h>
int main(){
    double a,b,c,h;
    double area;
    scanf("%lf,%lf,%lf",&a,&b,&c);
    if(a+b>c&&a+c>b&&b+c>a){
        h=(a+b+c)/2;
        area=sqrt(h*(h-a)*(h-b)*(h-c));
        printf("%.2lf\n",area);
    }
    else{
        printf("无法构成三角形!\n");
    }
    return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩荩さん!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值