- 输出“Hello World”(mooc第一周编程练习)
# 定义main函数,如果定义为 int型的函数,记得要有返回值0,如果定义为void则不需要返回值。
tip1:关于int main() 和 void main()
// 输出“Hello World”
#include<stdio.h>
int main(){
printf("Hello World");
return 0;
}
题目内容:
逆序的三位数:
程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
提示:用%10可以得到个位数,用/100可以得到百位数...。将这样得到的三个数字合起来:百位*100+十位*10+个位,就得到了结果。
注意:除了题目要求的输出,不能输出任何其他内容,比如输入时的提示,输出时的说明等等都不能。这道题目要求输出逆序的数字,程序就只能输出这个数字,除此之外任何内容都不能输出。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出逆序的数。
输入样例:
123
输出样例:
321
时间限制:500ms内存限制:32000kb
// 逆序三位数
#include <stdio.h>
int main(){
int num, ones, tens, hundreds;
scanf("%d", &num);
ones = num%10;
tens = (num-ones)%100/10;
hundreds = (num-ones-tens)/100;
printf("%d",ones*100+tens*10+hundreds);
return 0;
}
// 逆序三位数(数组)
// %s和%d输出结果相同?
#include<stdio.h>
int main(){
char a[3];
scanf("%s", a);
for (int i=strlen(a)-1;i>=0;i--){
printf("%c", a[i]);
}
return 0;
}
题目内容:
UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
有效的输入范围是0到2359,即你的程序不可能从测试服务器读到0到2359以外的输入数据。
你的程序要输出这个时间对应的UTC时间,输出的格式和输入的相同,即输出一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。
提醒:要小心跨日的换算。
输入格式:
一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。
输出格式:
一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。
输入样例:
803
输出样例:
3
时间限制:500ms内存限制:32000kb
// 题目没有说明是否有1190这样的输入,故加入了一个if判别式,来剔除错误输入
// 时间换算
#include<stdio.h>
int main(){
int BJT, temp;
scanf("%d", &BJT);
if (BJT%100>59){
temp = BJT%100;
temp -=60;
BJT = (BJT/100+1)*100 + temp;
}
BJT -= 800;
if (BJT<0) BJT += 2400;
printf("%d", BJT);
return 0;
}
题目内容:
班级第一次列队,通常老师会让同学按身高排成一列,然后1、2报数,喊到1的同学向前一 步,就这样,队伍就变成两列了。假设现在一个班级有n个同学,并且他们已经按身高排成 了一列,同学按身高从1到n编号,你能告诉我最后哪些编号的同学站在了第一列么?
输入格式:
输入一个正整数n,表示班级的人数。
输出格式:
按顺序输出所有在第一列的同学对应的编号,每两个编号之间用一个空格隔开,最后一个编号后面没有空格。
输入样例:
11
输出样例:
1 3 5 7 9 11
时间限制:500ms内存限制:32000kb
// 分队列
// 给出一个整数n,输出1到n之间的奇数
#include <stdio.h>
int main()
{
int n, i=1;
scanf("%d", &n);
for (; i<=n; i+=2){
if (i+1 ==n|| i==n) printf("%d", i);
else printf("%d ", i);
}
return 0;
}
题目内容:
你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
输入格式:
一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。
输出格式:
两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。
输入样例:
9 3 4 2 5 7 -1
输出样例:
4 2
时间限制:500ms内存限制:32000kb
// 奇偶个数
#include<stdio.h>
int main(){
int N, count_double=0, count_single=0;
scanf("%d", &N);
while(N != -1){
if (N%2 ==0) count_double +=1;
else count_single +=1;
scanf("%d", &N);
}
printf("%d %d", count_single, count_double);
return 0;
}
题目内容:
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。
这里的计算可以用下面的表格来表示:
|
数字
|
3
|
4
|
2
|
3
|
1
|
5
|
|
数位
|
6
|
5
|
4
|
3
|
2
|
1
|
|
数字奇偶
|
奇
|
偶
|
偶
|
奇
|
奇
|
奇
|
|
数位奇偶
|
偶
|
奇
|
偶
|
奇
|
偶
|
奇
|
|
奇偶一致
|
0
|
0
|
1
|
1
|
0
|
1
|
|
二进制位值
|
32
|
16
|
8
|
4
|
2
|
1
|
你的程序要读入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式:
一个非负整数,整数的范围是[0,1000000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
时间限制:500ms 内存限制:32000kb
// 数字特征值
#include<stdio.h>
#include<math.h>
int main(){
int N, digit=0, temp;
scanf("%d", &N);
temp = 1;
// 计算出输入数字位数
while(N/temp!=0) {
digit++;
temp = pow(10, digit);
}
int sum = 0;
// 比较位数和位值的关系,相同二进制值位1,不同值为0,并将结果转化成10进制赋予sum
for (int i=digit;i>=1;i--){
temp = pow(10, i-1);
if (i%2 == (N/temp)%2) sum += pow(2, i-1);
N %= temp;
}
printf("%d", sum);
return 0;
}
题目内容:
我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入格式:
两个整数,第一个表示n,第二个表示m。
输出格式:
一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入样例:
2 4
输出样例:
15
时间限制:500ms内存限制:32000kb
// 素数和(自己写的)
#include<stdio.h>
int main(){
int M, N, sum=0, count =0;
scanf("%d %d", &M, &N);
for (int i=2;;i++){
for (int j=1;j<=i;j++){
if (i%j==0&&j!=1&&j!=i) break;
if (j == i){
count +=1;
if(M<=count&& count<=N) sum += i;
}
}
if(count>200) break;
}
printf("%d", sum);
return 0;
}
// 传统判断素数的方法(翁凯老师)
#include<stdio.h>
// 在已知的素数表内判断新数字是否为素数
int isPrime(int x, int knowPrimes[], int numbeOfKnownPrimes){
int ret = 1;
int i;
for ( i=0; i<numbeOfKnownPrimes; i++ ){
if ( x % knowPrimes[i] == 0){
ret = 0;
break;
}
}
return ret;
}
int main(){
// const int number = 100;
// 网页开发环境中,这条语句不能通过
int prime[200] = {2};
int count = 1;
int i = 3;
while ( count < 200 ){
if ( isPrime(i, prime, count )) {
prime[count++] = i; // 在素数表内判断后,由返回结果判断是否将新数字加入到素数表内
}
i++;
}
// 输出素数表,每五个素数换行一次
// for ( i=0; i<200; i++){
// printf("%d", prime[i]);
// if ( (i+1)%5 ) printf("\t");
// else printf("\n");
// }
int start, end, sum=0;
scanf("%d %d", &start, &end);
for (int k=start-1;k<=end-1;k++) sum += prime[k];
printf("%d", sum);
return 0;
}
题目内容:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:
yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:
fu er san si yi
输入格式:
一个整数,范围是[-100000,100000]。
输出格式:
表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例:
-30
输出样例:
fu san ling
时间限制:500ms内存限制:32000kb
// 念整数
#include<stdio.h>
#include<math.h>
int main(){
int N, i, val, temp=1, digit=0;
scanf("%d", &N);
// 计算该整数的位数
while(N/temp!=0){
digit++;
temp = pow(10, digit);
}
// 负整数需要特殊处理
if (N<0) {
printf("fu ");
N = -N;
}
// 整数为零需要特殊处理
if (digit ==0) printf("ling");
// 念整数核心实现部分
for (int j=digit-1;j>=0;j--){
temp = pow(10, j);
val = N / temp;
switch (val){
case 0:printf("ling"); break;
case 1:printf("yi"); break;
case 2:printf("er"); break;
case 3:printf("san"); break;
case 4:printf("si"); break;
case 5:printf("wu"); break;
case 6:printf("liu"); break;
case 7:printf("qi"); break;
case 8:printf("ba"); break;
case 9:printf("jiu"); break;
}
N -= temp * val;
if (j!=0) printf(" ");return 0;
}
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。
注意每遍占一行,除了每行的回车不能有任何多余字符。
// 重要的话说三遍
#include <stdio.h>
int main(int argc, char **argv) {
for(int i=0; i<3; i++){
printf("I'm gonna WIN!\n");
}
return 0;
}
-
7-2 I Love GPLT (5 分)(PTA)
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了。
所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
// I Love GPLT
#include <stdio.h>
int main()
{
char *p = "I Love GPLT";
while(*p){
printf("%c\n", *p++);
}
return 0;
}
本题要求编写程序,输出指定的带框文字。
输入格式:
本题无输入
输出格式:
按照下列格式输出带框文字。
************ Welcome ************
// 输出带框文字
#include<stdio.h>
int main(){
char a[]="************";
char b[]="Welcome";
// 标准输出可以控制第二行的Welcome占用10个位置,且靠右输出
printf("%s\n%9s\n%s",a, b, a);
return 0;
}
本题要求编写程序,输出指定的由“A”组成的菱形图案。
输入格式:
本题无输入
输出格式:
按照下列格式输出由“A”组成的菱形图案。
A
A A
A
// 输出菱形图案
#include<stdio.h>
void diamond(int n){
for(int i=1; i<=n; i++){
if (i%2==1){
printf(" A\n");
}
else {
printf("A A\n");
}
}
}
int main(){
diamond(3);
return 0;
}
-
7-5 输出倒三角图案 (5 分)(PTA本题要求编写程序,输出指定的由“*”组成的倒三角图案。
输入格式:
本题目没有输入。
输出格式:
按照下列格式输出由“*”组成的倒三角图案。
* * * *
* * *
* *
*
// 输出倒三角形图案
#include<stdio.h>
// 能生成N阶倒三角形的一个函数,主要分成三部分
void trangle(int N){
for(int i=N; i>0; i--){
// 第一个for,输出每一行倒三角形前面的空格
for(int p=1; p<=N-i; p++){
printf(" ");
}
// 第二个for,输出每一行除最后一个的※号
for (int q=1; q<=i-1; q++){
printf("* ");
}
// 输出每行最后一个※号
printf("*\n");
}
}
int main(){
trangle(5);
return 0;
}
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
输出样例:
5 6
// 厘米换算英尺尺寸
#include<stdio.h>
int main(){
int length, foot, inch;
double foot_dot;
scanf("%d", &length);
foot = length/30.48;
foot_dot = length/30.48;
inch = (foot_dot-foot)*12;
printf("%d %d", foot, inch);
return 0;
}
给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出一个华氏温度。
输出格式:
在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。
输入样例:
150
输出样例:
Celsius = 65
// 计算摄氏温度
#include<stdio.h>
int main(){
int C_temper, F_temper;
scanf("%d", &F_temper);
C_temper = 5 * (F_temper - 32) / 9;
printf("Celsius = %d\n", C_temper);
return 0;
}
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤是公斤的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)
输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。
输入样例:
169
输出样例:
124.2
// 是不是太胖了
#include<stdio.h>
int main(){
int H;
double W;
scanf("%d", &H);
W = (H -100)*0.9*2;
printf("%.1lf", W);
return 0;
}
本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出4个整数,其间以空格分隔。
输出格式:
在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。
输入样例:
1 2 3 4
输出样例:
Sum = 10; Average = 2.5
// 求整数均值
#include<stdio.h>
int main(){
int a, b, c, d, sum=0;
double Average;
scanf("%d%d%d%d", &a, &b, &c, &d);
sum = a + b +c + d;
Average = sum/4.0;
printf("Sum = %d; Average = %.1lf\n", sum, Average);
return 0;
}
-
7-10 算术入门之加减乘除 (10 分)(PTA)
对于输入的两个整数,按照要求输出其和差积商。
输入格式:
在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。
输出格式:
共四行,格式是:
[a] + [b] = [a+b]
[a] - [b] = [a-b]
[a] * [b] = [a*b]
[a] / [b] = [a/b]
其中,带有方括号的内容(如[a]、[b]、[a+b]等)表示相应整数或运算结果的值,在输出时要用实际的值代替。
并且:如果a能够被b整除,那么a/b应输出为整数格式,否则a/b输出为带两位小数的格式。
提示:注意表达式中的空格。
输入样例1:
6 3
输出样例1:
6 + 3 = 9
6 - 3 = 3
6 * 3 = 18
6 / 3 = 2
输入样例2:
8 6
输出样例2:
8 + 6 = 14
8 - 6 = 2
8 * 6 = 48
8 / 6 = 1.33
// 算术入门之加减乘除
#include<stdio.h>
void basic_fun();
void basic_fun(int Num1, int Num2){
int residual;
residual = Num1%Num2;
printf("%d + %d = %d\n", Num1, Num2, Num1 + Num2);
printf("%d - %d = %d\n", Num1, Num2, Num1 - Num2);
printf("%d * %d = %d\n", Num1, Num2, Num1 * Num2);
if (residual != 0) printf("%d / %d = %.2lf\n", Num1, Num2, Num1/(double)Num2);
else printf("%d / %d = %d\n", Num1, Num2, Num1/Num2);
}
int main(){
int Num1, Num2;
scanf("%d%d", &Num1, &Num2);
basic_fun(Num1, Num2);
return 0;
}
已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。
输入格式:
本题无输入
输出格式:
按照下列格式输出结果:
math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩
// 计算平均分
#include<stdio.h>
int main(){
int math = 87, english = 72, computer = 93, avg;
avg = (math + english + computer) / 3;
printf("math = %d, eng = %d, comp = %d, average = %d\n", math, english, computer, avg);
return 0;
}
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。
输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。
输入样例:
03-15-2017
输出样例:
2017-03-15
// 日期格式化
#include<stdio.h>
int main(){
int day, month, year;
scanf("%d-%d-%d", &month, &day, &year);
printf("%d-%02d-%02d",year, month, day);
}
如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。
输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。
输出格式:
在一行中输出D天的后天是星期几。
输入样例:
3
输出样例:
5
// 后天(The day after tomorrow)
#include<stdio.h>
int main(){
int N;
scanf("%d", &N);
if (N==5) printf("7");
else printf("%d", (N+2)%7);
return 0;
}
有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式:
输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
// 然后是几点(化整为零再化整法)
#include<stdio.h>
int main(){
int Time_start, Time_end, Time_minute, Time_passed;
scanf("%d%d", &Time_start, &Time_passed);
// 将现在时间全部化成分钟
Time_minute = Time_start/100 * 60 + Time_start % 100;
// 加上经过的时间
Time_minute += Time_passed;
// 再化成小时分钟的形式
Time_end = Time_minute/60 * 100 + Time_minute % 60;
printf("%d\n", Time_end);
return 0;
}
// 然后是几点(直接计算法)
#include<stdio.h>
int main(){
printf("%d", Time_minute);
int Time_now, passed;
scanf("%d %d", &Time_now, &passed);
// 直接将经过的时间加到现在的时间上
Time_now = Time_now + (passed/60)*100 + passed%60;
// 如果加的是正向时间,考虑进位问题
if (Time_now%100 >= 60 && passed>0) {
Time_now += 40;
}
// 如果加的是反向时间,考虑借位问题
else if (Time_now%100 >= 60 || passed <-40 && passed<0) {
Time_now -= 40;
}
printf("%d", Time_now);
return 0;
}
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
// BCD解密
// 本题中将错误的BCD十进制数->二进制->十六进制->BCD十进制这个过程,由于输入范围是
// 0~153 对应的十六进制范围0x00~0x99,恰好可以利用BCD十进制数对16整除、求余的
// 结果拿过来成为正确的BCD十进制输出
#include<stdio.h>
int main(){
int n,a,b;
scanf("%d",&n);
a = n/16;
b = n%16;
printf("%d",a*10+b);
return 0;
}
-
7-16 计算符号函数的值 (10 分)(PTA)
对于任一整数n,符号函数sign(n)的定义如下:
![]()
请编写程序计算该函数对任一输入整数的值。
输入格式: 输入在一行中给出整数n。
输出格式: 在一行中按照格式"sign(n) = 函数值"输出该整数n对应的函数值。
输入样例1: 10 输出样例1: sign(10) = 1 输入样例2: 0 输出样例2: sign(0) = 0 输入样例3: -98 输出样例3: sign(-98) = -1
// 计算符号函数的值
#include<stdio.h>
int main(){
int N;
scanf("%d", &N);
if(N>0){
printf("sign(%d) = 1\n", N);
}
else if(N==0){
printf("sign(%d) = 0\n", N);
}
else{
printf("sign(%d) = -1\n", N);
}
return 0;
}
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A; 小于90且大于等于80为B; 小于80且大于等于70为C; 小于70且大于等于60为D; 小于60为E。 输入格式: 输入在一行中给出一个整数的百分制成绩。
输出格式: 在一行中输出对应的五分制成绩。
输入样例: 90 输出样例: A
// 成绩转换
#include<stdio.h>
int main(){
int score;
scanf("%d", &score);
switch(score/10){
case 10:
case 9: printf("A\n");break;
case 8: printf("B\n");break;
case 7: printf("C\n");break;
case 6: printf("D\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: printf("E\n");break;
default: printf("Error!");break;
}
return 0;
}
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
起步里程为3公里,起步费10元; 超起步里程后10公里内,每公里2元; 超过10公里以上的部分加收50%的回空补贴费,即每公里3元; 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。 输入格式: 输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。
输出格式: 在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。
输入样例1: 2.6 2 输出样例1: 10 输入样例2: 5.1 4 输出样例2: 14 输入样例3: 12.5 9 输出样例3: 34
// 出租车计价
#include<stdio.h>
int main(){
double Distance, fee;
int Waiting_time, fee_int;
scanf("%lf%d", &Distance, &Waiting_time);
// 起步范围内计费+等候时间计费
if (Distance<=3){
fee = 10 + Waiting_time / 5 * 2;
}
// 十公里内计费+等候时间计费
else if(Distance<=10){
fee = 10 + (Distance-3)*2 + Waiting_time / 5 * 2;
}
// 十公里以上计费+等候时间计费
else{
fee = 10 + 14 + (Distance-10)*3 + Waiting_time / 5 * 2;
}
// 最终计费四舍五入
fee_int = (int)fee;
if(fee-fee_int>=0.5){
printf("%d\n", fee_int+1);
}
else{
printf("%d\n", fee_int);
}
return 0;
}
本题要求编写程序计算某年某月某日是该年中的第几天。
输入格式: 输入在一行中按照格式"yyyy/mm/dd"(即"年/月/日")给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式: 在一行输出日期是该年中的第几天。
输入样例1: 2009/03/02 输出样例1: 61 输入样例2: 2000/03/02 输出样例2: 62
// 计算天数
#include<stdio.h>
int main(){
int year, month, day, day_total=0, Feb;
scanf("%d/%d/%d", &year, &month, &day);
// 判断是否是闰年
if ((year%4 ==0 && year%100 !=0)||year% 400 ==0){
Feb = 29;
}else{
Feb = 28;
}
// 便利循环1到12个月,把每个月的天数加在总天数上
for (int i=1, day_per_month; i<=month; i++){
if (i<month){
if (i==1||i==3||i==5||i==7||i==8||i==10||i==12){
day_per_month = 31;
}else if(i ==2){
day_per_month = Feb;
}else{
day_per_month = 30;
}
day_total += day_per_month;
}
if (i == month){
day_total += day;
}
}
printf("%d\n", day_total);
return 0;
}
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式: 输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号"="说明输入结束。
输出格式: 在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息"ERROR"。
输入样例: 1+2*10-10/2= 输出样例: 10
// 简单计算器
#include<stdio.h>
int main(){
char math;
int a, b, flag=1;
scanf("%d", &a);
while(scanf("%c", &math)&&flag){
switch(math){
case '+':scanf("%d", &b); a += b; break;
case '-':scanf("%d", &b); a -= b; break;
case '*':scanf("%d", &b); a *= b; break;
case '/':scanf("%d", &b); if(b == 0) {
printf("ERROR");
flag =0;
break;
}else {
a /= b;
break;
}
case '=': printf("%d", a); flag=0; break;
default : printf("ERROR"); flag=0; break;
}
}
return 0;
}
模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示"Speeding",否则显示"OK"。
输入格式: 输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。
输出格式: 在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK。
输入样例1: 40 输出样例1: Speed: 40 - OK 输入样例2: 75 输出样例2: Speed: 75 - Speeding
// 超速判断
#include<stdio.h>
int main(){
int Speed;
scanf("%d", &Speed);
if(Speed>60){
printf("Speed: %d - Speeding\n", Speed);
}else{
printf("Speed: %d - OK\n", Speed);
}
return 0;
}
三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
输入格式: 输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式: 在一行中输出唯一的那个不一样的球。
输入样例: 1 1 2 输出样例: C
// 用天平找小球
#include<stdio.h>
int main(){
int A, B, C;
scanf("%d%d%d", &A, &B, &C);
if(A == B){
printf("C");
}else if(A == C){
printf("B");
}else{
printf("A");
}
return 0;
}
-
7-23 分段计算居民水费 (10 分)(PTA)
为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。
输入格式: 输入在一行中给出非负实数x。
输出格式: 在一行输出应交的水费,精确到小数点后2位。
输入样例1: 12 输出样例1: 16.00 输入样例2: 16 输出样例2: 22.50
// 分段计算居民水费
#include<stdio.h>
int main(){
double water_T, water_P;
scanf("%lf", &water_T);
if(water_T<=15){
water_P = water_T *4 /3;
}else{
water_P = water_T *2.5 - 17.5;
}
printf("%.2lf", water_P);
return 0;
}
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了("Too big"),还是小了("Too small"),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示"Bingo!";如果3次以内猜到该数,则提示"Lucky You!";如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示"Good Guess!";如果超过N次都没有猜到,则提示"Game Over",并结束程序。如果在到达N次之前,用户输入了一个负数,也输出"Game Over",并结束程序。
输入格式: 输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式: 在一行中输出每次猜测相应的结果,直到输出猜对的结果或"Game Over"则结束。
输入样例: 58 4 70 50 56 58 60 -2 输出样例: Too big Too small Too small Good Guess!
// 猜数字游戏
#include<stdio.h>
int main() {
int rand_num, guess_num, N;
scanf("%d %d", &rand_num, &N);
for(int i = 1; i <= N; i++) {
scanf("%d", &guess_num);
// 猜中时,根据猜测次数输出结果
if (guess_num == rand_num) {
switch(i) {
case 1: printf("Bingo!\n"); break;
case 2:
case 3: printf("Lucky You!\n"); break;
default: printf("Good Guess!\n"); break;
}
goto exit;
// 没猜中时,根据二者大小进行输出,并经行下一次判断
}else if (guess_num < rand_num && guess_num > 0) {
printf("Too small\n");
if (i == N) {
printf("Game Over\n");
break;
}
}else if (guess_num > rand_num) {
printf("Too big\n");
if (i == N) {
printf("Game Over\n");
break;
}
}else if (guess_num < 0 || i == N) {
printf("Game Over\n");
break;
}
}
exit:
return 0;
}
本题要求计算给定的一系列正整数中奇数的和。
输入格式: 输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式: 在一行中输出正整数序列中奇数的和。
输入样例: 8 7 4 3 70 5 6 101 -1 输出样例: 116
// 求奇数和
#include<stdio.h>
int main(){
int num, sum=0;
for(int i=0;;i++){
scanf("%d", &num);
if(num<=0){
printf("%d\n", sum);
break;
}else if(num%2!=0) {
sum += num;
}
}
return 0;
}
-
7-26 最大公约数和最小公倍数 (15 分)(PTA)
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
// 求最大公约数和最小公倍数
#include<stdio.h>
int Maxcommondivisor();
int Mincommonmutiple();
// 最大公约数
int Maxcommondivisor(int m, int n){
int rem;
while(n>0){
rem = m%n;
m = n;
n = rem;
}
return m;
}
// 最小公倍数
int Mincommonmutiple(int m, int n, int d){
int a;
a = m * n / d;
return a;
}
int main(){
int m, n, d;
scanf("%d%d", &m, &n);
printf("%d ", d=Maxcommondivisor(m, n));
printf("%d\n", Mincommonmutiple(m, n, d));
return 0;
}
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式: 输入在一行中给出一个不超过10000的正整数N。
输出格式: 在一行中输出兔子总数达到N最少需要的月数。
输入样例: 30 输出样例: 9
// 兔子繁衍问题
#include<stdio.h>
int Fibonacci();
// 兔子繁衍问题可以等效的看作是斐波那契数列问题
int Fibonacci(int N){
if(N ==1|| N ==2){
return 1;
}
else{
return Fibonacci(N-2) + Fibonacci(N-1);
}
}
int main(){
int number, month;
scanf("%d", &number);
for (int i=1;;i++){
if(Fibonacci(i)>=number){
printf("%d\n", i);
break;
}
}
return 0;
}
- 7-28 求整数的位数及各位数字之和 (15 分)(PTA)
对于给定的正整数N,求它的位数及其各位数字之和。
输入格式: 输入在一行中给出一个不超过10的9次方 的正整数N。
输出格式: 在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。
输入样例: 321 输出样例: 3 6
// 求整数的位数及各位数字之和
#include<stdio.h>
#include<math.h>
int main(){
int N, i=0, temp = 1, sum = 0;
scanf("%d", &N);
// 求输入整数的位数
while(N/temp){
i++;
temp = pow(10,i);
}
// 求各个位数之和
for (int j=i-1;j>=0;j--){
temp = pow(10, j);
sum += N/temp;
N %= temp;
}
printf("%d %d", i, sum);
return 0;
}
-
7-29 二分法求多项式单根 (20 分)(PTA)
二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。
二分法的步骤为:
检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2); 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环; 如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。 本题目要求编写程序,计算给定3阶多项式
f(x)=a3x3+a2x2+a1x+a0
在给定区间[a,b]内的根。输入格式:输入在第1行中顺序给出多项式的4个系数
a3 a2 a1 a0 ,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式: 在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例: 3 -1 -3 1 -0.5 0.5 输出样例: 0.33
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu 输入格式: 输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式: 在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
输入样例: -600 输出样例: fu liu ling ling
// 念数字
#include<stdio.h>
#include<math.h>
int main(){
int N, M, i=0, digit=0, temp, pow1;
char *a[10] = {"ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
scanf("%d", &N);
M = N;
// 读取数字位数
while(M!=0){
M /= 10;
digit++;
}
if(N == 0) digit = 1;
if(N < 0){
printf("fu ");
N *= -1;
}
// 循环输出每位对应的汉字
for (i=digit;i>0;i--){
pow1 = pow(10,i-1);
temp = N/pow1;
if (i==1) printf("%s", a[temp]);
else printf("%s ", a[temp]);
N %= pow1;
}
return 0;
}
![]()
// 掉入陷阱的数字
#include<stdio.h>
int number_trap(int N){
int sum=0, result;
while(N){
sum += N % 10;
N /= 10;
}
result = sum * 3 + 1;
return result;
}
int main(){
int N, temp, result;
scanf("%d", &N);
temp = N;
for (int i=1;;i++){
result = number_trap(temp);
printf("%d:%d\n", i, result);
if (temp == result) break;
temp = result;
}
return 0;
}
- 7-32 求交错序列前N项和 (15 分)(PTA)
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
输入格式: 输入在一行中给出一个正整数N。
输出格式: 在一行中输出部分和的值,结果保留三位小数。
输入样例: 5 输出样例: 0.917
// 求交错序列前N项和
#include<stdio.h>
#include<math.h>
int main() {
int N;
scanf("%d", &N);
float sum = 0;
for (float j = 1; j <= N; j++) {
sum += (j/(2*j-1))*pow(-1, j+1);
}
printf("%.3f\n", sum);
return 0;
}
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式: 输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例: 10 31 输出样例: 7 143
// 统计素数并求和
#include<stdio.h>
const int maxNumber = 501;
int main(){
int isPrime[maxNumber];
int i;
int x;
// 定义一个素数表,初始化假设isPrime表内数字均为素数
for ( i = 0; i<maxNumber; i++ ){
if (i == 1 || i == 0 ) isPrime[i] = 0;
else isPrime[i] =1;
}
// 从较小的数字开始,排除个位素数的倍数,标记为0,遍历顺序由小到大
for ( x=2; x<maxNumber; x++){
if ( isPrime[x] ){
for ( i=2; i*x<maxNumber; i++){
isPrime[i*x] = 0;
}
}
}
int m, n, sum=0, count=0;
scanf("%d %d", &m, &n);
// 输出标记为非零的数组下标
for ( i=m; i<=n; i++){
if ( isPrime[i] ) {
sum += i;
count++;
}
}
printf("%d %d\n", count, sum);
return 0;
}
-
7-34 求分数序列前N项和 (15 分)(PTA)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式: 输入在一行中给出一个正整数N。
输出格式: 在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例: 20 输出样例: 32.66
// 求分数序列前N项和
#include<stdio.h>
int main() {
int N;
double sum = 0, num_up = 2.0, num_down = 1.0;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
sum += num_up/num_down;
num_up += num_down;
num_down = num_up - num_down;
}
printf("%.2f\n", sum);
return 0;
}
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式: 输入在一行中给出正整数N(1<N≤10)。
输出格式: 在一行中输出第一天共摘了多少个桃子。
输入样例: 3 输出样例: 10
// 猴子吃桃问题
#include<stdio.h>
int main() {
int N = 0, num = 1;
scanf("%d", &N);
for (int i = N-1; i > 0; i--) {
num = (num+1)*2;
}
printf("%d\n", num);
return 0;
}
在中国数学史上,广泛流传着一个"韩信点兵"的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按从1至7报数,记下最末一个士兵报的数为4; 最后按从1至11报数,最末一个士兵报的数为10; 请编写程序计算韩信至少有多少兵。
输入格式: 本题无输入
输出格式: 输出韩信至少拥有的士兵人数。
// 韩信点兵
#include<stdio.h>
int main() {
int N;
for (int i = 1;;i++) {
if(i%5 == 1 && i%6 == 5 && i%7 == 4 && i%11 == 10) {
printf("%i\n", i);
break;
}
}
return 0;
}
-
7-37 输出整数各位数字 (15 分)(PTA)
本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。
输入格式: 输入在一行中给出一个长整型范围内的非负整数。
输出格式: 从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。
输入样例: 123456 输出样例: 1 2 3 4 5 6
// 输出整数各位数字
#include<stdio.h>
int main() {
int N, mask = 1, temp, t;
scanf("%d", &N);
t = N;
while(t > 9) {
t /= 10;
mask *= 10;
}
// 这里采用mask作为循环的判定标识,是为了避免出现N=100这种情况,不能完全
// 输出每一位数字
do {
temp = N / mask;
printf("%d ", temp);
N %= mask;
mask /= 10;
}while(mask > 0);
return 0;
}
一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?
输入格式: 输入在一行中给出小于100的正整数n。
输出格式: 在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。
输入样例1: 23 输出样例1: 25.51 输入样例2: 22 输出样例2: No Solution
// 支票面额
// Bad solution
#include<stdio.h>
int main(){
int X, Y, N, flag = 1;
scanf("%d", &N);
for (int i=0;i<=100 && flag;i++){
for (int j=1;j<=100 && flag ;j++){
if((2*i == j && 2*j == i-N )||(2*i+1 == j && 2*j-100== i-N)||
(2*i+2==j && 2*j -100==i+100-N)){
flag = 0;
printf("%d.%d\n", i,j);
}
}
}
if (flag) printf("No Solution\n");
return 0;
}
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式: 输入在一行中给出比赛时间T(分钟)。
输出格式: 在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。
输入样例: 242 输出样例: @_@ 726
// 龟兔赛跑
// 借鉴网上的思路,原来的方法太复杂了
#include<stdio.h>
int main() {
int rabbit = 0, tor = 0, T, rab_run = 1, t = 10;
scanf("%d", &T);
// 龟兔赛跑的核心
while(t <= T){
tor = 3 * t;
rabbit += rab_run * 90;
if(rabbit > tor){
rab_run = 0;
t += 20;
}else
rab_run = 1;
t += 10;
}
tor = 3 * T;
// 例如当比赛时间为44分钟,兔子还没有超过乌龟,但由于while循环里最后一行t+=10
// 导致t=50 循环终止,为了补偿兔子的4分钟,特设此条件语句
if (rab_run)
rabbit = rabbit + (10-(t-T))*9;
if(rabbit > tor)
printf("^_^ %d\n", rabbit);
else if(tor > rabbit)
printf("@_@ %d\n", tor);
else
printf("-_- %d\n", rabbit);
return 0;
}
-
7-40 到底是不是太胖了 (10 分)(PTA)
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
输入格式: 输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。
输出格式: 为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
输入样例: 3 169 136 150 81 178 155 输出样例: You are wan mei! You are tai shou le! You are tai pang le!
// 到底是不是太胖了?
#include<stdio.h>
#include<math.h>
void beauty(int h, int w) {
double standard_w, temp_1, temp_2;
standard_w = (h-100)*0.9;
temp_1 = w/2.0 - standard_w;
temp_2 = standard_w*0.1;
if(fabs(temp_1) < temp_2)
printf("You are wan mei!\n");
else if(w/2.0 > standard_w)
printf("You are tai pang le!\n");
else
printf("You are tai shou le!\n");
}
int main() {
int N, H, W;
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%d %d", &H, &W);
beauty(H, W);
}
return 0;
}
|
|
|