文章目录
- 7-1 重要的话说三遍 (5 分)
- 7-2 I Love GPLT (5 分)
- 7-3 输出带框文字 (5 分)
- 7-4 输出菱形图案 (5 分)
- 7-5 输出倒三角图案 (5 分)
- 7-6 厘米换算英尺英寸 (15 分)
- 7-7 计算摄氏温度 (10 分)
- 7-8 是不是太胖了 (5 分)
- 7-9 求整数均值 (10 分)
- 7-10 算术入门之加减乘除 (10 分)
- 7-11 计算平均分 (5 分)
- 7-12 日期格式化 (5 分)
- 7-13 后天 (5 分)
- 7-14 然后是几点 (15 分)
- 7-15 BCD解密 (10 分)
- 7-16 计算符号函数的值 (10 分)
- 7-17 成绩转换 (15 分)
- 7-18 出租车计价 (15 分)
- 7-19 计算天数 (15 分)
- 7-20 简单计算器 (20 分)
- 7-21 超速判断 (10 分)
- 7-22 用天平找小球 (10 分)
- 7-23 分段计算居民水费 (10 分)
- 7-24 猜数字游戏 (15 分)
- 7-25 求奇数和 (15 分)
- 7-26 最大公约数和最小公倍数 (15 分)
- 7-27 兔子繁衍问题 (15 分)
- 7-28 求整数的位数及各位数字之和 (15 分)
- 7-29 二分法求多项式单根 (20 分)
- 7-30 念数字 (15 分)
- 7-31 掉入陷阱的数字 (15 分)
- 7-32 求交错序列前N项和 (15 分)
- 7-33 统计素数并求和 (20 分)
- 7-34 求分数序列前N项和 (15 分)
- 7-35 猴子吃桃问题 (15 分)
- 7-36 韩信点兵 (10 分)
- 7-37 输出整数各位数字 (15 分)
- 7-38 支票面额 (15 分)
- 7-39 龟兔赛跑 (20 分)
- 7-40 到底是不是太胖了 (10 分)
- 7-41 计算阶乘和 (10 分)
- 7-42 整除光棍 (20 分)
- 7-43 Shuffling Machine (20 分)
- 7-44 黑洞数 (20 分)
- 7-45 找完数 (20 分)
- 7-46 爬动的蠕虫 (15 分)
- 7-47 二进制的前导的零 (10 分)
- 7-48 求组合数 (15 分)
- 7-49 Have Fun with Numbers (20 分)
- 7-50 输出华氏-摄氏温度转换表 (15 分)
- 7-51 求奇数分之一序列前N项和 (15 分)
- 7-52 求简单交错序列前N项和 (15 分)
- 7-53 生成3的乘方表 (15 分)
- 7-54 求阶乘序列前N项和 (15 分)
- 7-55 查询水果价格 (15 分)
- 7-56 求给定精度的简单交错序列部分和 (15 分)
- 7-57 求e的近似值 (15 分)
- 7-58 求幂级数展开的部分和 (20 分)
- 7-59 打印菱形图案 (15 分)
- 7-60 Welcome to You! (5 分)
- 7-61 Programming in C is fun! (5 分)
- 7-62 计算物体自由下落的距离 (5 分)
- 7-63 高空坠球 (20 分)
- 7-64 统计大写辅音字母 (15 分)
- 7-65 字符串替换 (15 分)
- 7-66 时间换算 (15 分)
- 7-67 What is a computer? (5 分)
- 7-68 求N分之一序列前N项和 (15 分)
- 7-69 换硬币 (20 分)
- 7-70 输出三角形面积和周长 (15 分)
中国大学MOOC浙江大学翁恺老师的《程序设计入门——C语言》2021秋季课程PTA编程练习题【其实每期练习题一致】,共140题,已全部答完,仅三道题借鉴了他人思维之后,全部为独立思考纯手敲代码(Dev-C++调试成功后,复制粘贴到PTA平台),现收集归拢【时间飞逝,存于CSDN草稿箱三年了,现整理格式发布】。
7-1 重要的话说三遍 (5 分)
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— “I’m gonna WIN!”——连续输出三遍就可以了。
注意每遍占一行,除了每行的回车不能有任何多余字符。
解题思路:直接打印输出即可,当时还未接触循环,所以老老实实敲了三遍
#include <stdio.h>
int main()
{
printf("I'm gonna WIN!\n");
printf("I'm gonna WIN!\n");
printf("I'm gonna WIN!\n");
return 0;
}
7-2 I Love GPLT (5 分)
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了。
所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
解题思路:这个应该是留到学了循环和字符串后开始学的,循环就行
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "I Love GPLT";
int n = strlen(s);
int i;
for (i=0;i<=n;i++)
{
printf("%c\n", s[i]);
}
return 0;
}
7-3 输出带框文字 (5 分)
本题要求编写程序,输出指定的带框文字。
输入格式:
本题无输入
输出格式:
按照下列格式输出带框文字。
解题思路:直接打印,学了循环和函数后可以使用函数和循环打印重复的*
#include <stdio.h>
int main()
{
printf("************\n");
printf(" Welcome\n");
printf("************\n");
return 0;
}
7-4 输出菱形图案 (5 分)
本题要求编写程序,输出指定的由“A”组成的菱形图案。
输入格式:
本题无输入
输出格式:
按照下列格式输出由“A”组成的菱形图案。
A
A A
A。
解题思路: 直接打印输出即可
#include <stdio.h>
int main()
{
printf(" A\n");
printf("A A\n");
printf(" A\n");
return 0;
}
7-5 输出倒三角图案 (5 分)
本题要求编写程序,输出指定的由“”组成的倒三角图案。
输入格式:
本题目没有输入。
输出格式:
按照下列格式输出由“”组成的倒三角图案。
解题思路: 1.自定了一个打印函数打印指定个数的空格;2.循环打印*
#include <stdio.h>
#include <string.h>
void myprint(int x)
{
int i;
for (i=0;i<x;i++)
{
printf(" ");
}
}
int main()
{
int i,j,x;
for (i=4;i>0;i--)
{
j = 4-i; // 空格shul
myprint(j);
printf("*");
for (x=0;x<i-1;x++)
{
printf(" *");
}
//myprint(j);
if (i!=1) printf("\n");
}
return 0;
}
7-6 厘米换算英尺英寸 (15 分)
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
结尾无空行
输出样例:
5 6
解题思路: 1.注意精度;2.单位换算
#include<stdio.h>
int main()
{
float x;
int foot, inch;
scanf("%f", &x);
x = x / 30.48;
foot = x;
inch = (x - foot) * 12;
printf("%d %d", foot, inch);
return 0;
}
7-7 计算摄氏温度 (10 分)
给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出一个华氏温度。
输出格式:
在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。
输入样例:
150
结尾无空行
输出样例:
Celsius = 65
解题思路: 四则运算,注意输出格式
#include<stdio.h>
int main()
{
int f;
scanf("%d", &f);
printf("Celsius = %d", 5 * (f - 32)/9);
return 0;
}
7-8 是不是太胖了 (5 分)
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)
输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。
输入样例:
169
结尾无空行
输出样例:
124.2
解题思路: 四则运算,注意保留的小数点位数
#include<stdio.h>
int main()
{
int h;
scanf("%d", &h);
float w = (h-100) * 0.9 * 2;
printf("%.1f", w) ;
return 0;
}
7-9 求整数均值 (10 分)
本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出4个整数,其间以空格分隔。
输出格式:
在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。
输入样例:
1 2 3 4
结尾无空行
输出样例:
Sum = 10; Average = 2.5
结尾无空行
解题思路: 1.累积和变量注意初始化;2.注意平均数的精度
#include <stdio.h>
int main()
{
int sum=0;
int num;
int i;
for (i=0;i<4;i++)
{
scanf("%d", &num);
sum += num;
}
printf("Sum = %d; Average = %.1f", sum, sum/4.0);
return 0;
}
7-10 算术入门之加减乘除 (10 分)
对于输入的两个整数,按照要求输出其和差积商。
输入格式:
在一行内输入两个不超过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>
int main()
{
int x,y;
scanf("%d %d", &x, &y);
printf("%d + %d = %d\n", x, y, x+y);
printf("%d - %d = %d\n", x, y, x-y);
printf("%d * %d = %d\n", x, y, x*y);
if (x/y * y == x)
{
printf("%d / %d = %d", x, y, x/y);
}
else
{
printf("%d / %d = %.2f", x, y, (float)x/y);
}
return 0;
}
7-11 计算平均分 (5 分)
已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。
输入格式:
本题无输入
结尾无空行
输出格式:
按照下列格式输出结果:
math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩
解题思路: 1.仔细点
#include<stdio.h>
int main()
{
int math = 87, eng = 72, comp = 93;
int sum = math + eng + comp;
printf("math = %d, eng = %d, comp = %d, average = %d", math, eng, comp, sum/3);
return 0;
}
7-12 日期格式化 (5 分)
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。
输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。
输入样例:
03-15-2017
结尾无空行
输出样例:
201# 7-03-15
解题思路: 1.循环遍历,注意下标从0开始
#include<stdio.h>
#include<string.h>
int main()
{
char s[11];
scanf("%s", s);
int i;
for (i=6;i<10;i++)
{
printf("%c", s[i]);
}
printf("-");
for (i=0;i<5;i++)
{
printf("%c",s[i]);
}
return 0;
}
7-13 后天 (5 分)
如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。
输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。
输出格式:
在一行中输出D天的后天是星期几。
输入样例:
3
结尾无空行
输出样例:
5
解题思路: 1.取余的变形吧,注意周六周天的后天是下一周了
#include<stdio.h>
int main()
{
int cur;
scanf("%d", &cur);
int last = cur + 2;
if (last > 7)
{printf("%d", last-7);}
else
{printf("%d", last);}
return 0;
}
7-14 然后是几点 (15 分)
有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。
输出格式:
输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
结尾无空行
输出样例:
1310
解题思路: 1.先取出小时、分钟数;2.统一转化为分钟数,再转换为小时和分钟;3.转换为格式要求的百进制小时、分钟格式
#include<stdio.h>
int main()
{
int cur, time;
scanf("%d %d", &cur, &time);
int h = cur / 100;
int m = cur - h * 100;
int last = h * 60 + m + time;
h = last / 60;
m = last - h * 60;
if (h==0) printf("0");
printf("%d", h*100+m);
return 0;
}
7-15 BCD解密 (10 分)
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
结尾无空行
输出样例:
12
解题思路: 按照提示的方法操作,仔细点没问题
#include<stdio.h>
int main()
{
int bit[8]={0};
int num;
int i = 7;
scanf("%d", &num);
while (num)
{
bit[i--] = num % 2;
num /= 2;
}
int h=0, l=0;
for (i=0;i<4;i++)
{
h = h * 2 + bit[i];
}
for (i=4;i<8;i++)
{
l = l * 2 + bit[i];
}
printf("%d", 10 * h + l);
return 0;
}
7-16 计算符号函数的值 (10 分)
对于任一整数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);
int res;
if (n == 0)
{
res = 0;
}
else if (n > 0)
{
res = 1;
}
else
{
res = -1;
}
printf("sign(%d) = %d", n, res);
return 0;
}
7-17 成绩转换 (15 分)
解题思路: 多分支选择
#include<stdio.h>
int main()
{
int grade;
scanf("%d", &grade);
int num = grade / 10;
switch (num)
{
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
{
printf("E");
break;
}
}
return 0;
}
7-18 出租车计价 (15 分)
解题思路: 仍旧是分段函数,条件判断选择
#include<stdio.h>
int main()
{
float d;
int t;
scanf("%f %d", &d, &t);
float res;
if (d <= 3)
{
res = 10;
}
else if ( d > 3 && d <= 10)
{
res = 10 + 2 * (d - 3);
}
else
{
res = 10 + 2 * (10 -3) + 3 * (d - 10);
}
res += 2 * (t / 5);
if ((res - (int)res) >=0.5)
{res += 1;}
printf("%d", (int)res);
return 0;
}
7-19 计算天数 (15 分)
解题思路: 1.先条件分支判断是否闰年;2.再循环一遍,根据大小月计算天数
#include<stdio.h>
int leap(int year)
{
int res = 0;
if (year % 4 == 0)
{
if (year % 400 == 0 || year % 100 != 0)
{
res = 1;
}
}
return res;
}
int main()
{
int year, month, day;
scanf("%d/%d/%d", &year, &month, &day);
int total = 0;
int i;
for (i=1;i<month;i++)
{
if (i==1 || i==3 || i == 5 || i==7 || i==8 || i==10 || i==12){total += 31;}
else if (i==2) {
total += 28;
if (leap(year)) total += 1;
}
else
{
total += 30;
}
}
total += day;
printf("%d",total);
return 0;
}
7-20 简单计算器 (20 分)
解题思路: 还是分支判断
#include<stdio.h>
#include<string.h>
int main()
{
char exp[1000];
scanf("%s", &exp);
int n = strlen(exp);
int i;
int pre=0;
char pre_s = '+';
int res = 0;
int flag = 1; //无非法输入
for (i=0; i<n; i++)
{
if (flag == 0)
{
break;
}
if ((exp[i] - '0') >= 0 && (exp[i] - '0') <= 9)
{
pre = pre * 10 + exp[i] - '0';
}
else
{
switch (pre_s)
{
case '+':
res += pre;
break;
case '-':
res -= pre;
break;
case '*':
res *= pre;
break;
case '/':
if (pre == 0)
{
flag = 0;
}
else
{
res /= pre;
}
break;
case '=':
break;
default:
{
flag = 0;
break;
}
}
pre = 0;
pre_s = exp[i];
}
}
if (flag)
{
printf("%d", res);
}
else
{
printf("ERROR");
}
return 0;
}
7-21 超速判断 (10 分)
解题思路: 分支选择
#include<stdio.h>
int main()
{
int s;
scanf(“%d”, &s);
if (s <=60)
{
printf(“Speed: %d - OK”, s);
}
else
{
printf(“Speed: %d - Speeding”, s);
}
return 0;
}
7-22 用天平找小球 (10 分)
解题思路: 分支判断
#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 分)
解题思路: 分支判断
#include<stdio.h>
int main()
{
float x, y=0;
scanf("%f", &x);
if (x <= 15)
{
y = 4 * x / 3;
}
else
{
y = 2.5 * x - 17.5;
}
printf("%.2f", y);
return 0;
}
7-24 猜数字游戏 (15 分)
解题思路: 分支判断
#include<stdio.h>
int main()
{
int num,n;
scanf("%d %d", &num, &n);
int guess, count=0;
while (count < n)
{
scanf("%d", &guess);
count += 1;
if (guess < 0)
{
break;
}
else if (guess == num)
{
if (count == 1) {printf("Bingo!");}
else if (count <= 3){printf("Lucky You!");}
else {printf("Good Guess!");}
break;
}
else if (guess > num)
{
printf("Too big\n");
}
else
{
printf("Too small\n");
}
}
if (guess < 0 || guess != num) // 负数或者n次均未猜测正确 ,其实可以不用guess<0,因为小于0时,即不等于num
{
printf("Game Over");
}
}
7-25 求奇数和 (15 分)
解题思路: 分支判断
#include<stdio.h>
int main()
{
int x;
int sum=0;
scanf("%d", &x);
while (x > 0)
{
if (x % 2 == 1)
{
sum += x;
}
scanf("%d", &x);
}
printf("%d", sum);
return 0;
}
7-26 最大公约数和最小公倍数 (15 分)
解题思路: 循环,辗转相除法求出最大公约数,而后乘积除以最大公约数为最小公倍数
#include<stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int a1 = a, b1 =b;
int tmp;
if (a < b)
{
tmp = a;
a = b;
b = tmp;
}
while (a%b != 0)
{
tmp = a % b;
a = b;
b = tmp;
}
printf("%d %d", b, a1 * b1 / b);
return 0;
}
7-27 兔子繁衍问题 (15 分)
解题思路: 斐波那契数列问题,a(n)=a(n-1)+a(n-2),a(n-1)为上个月的兔子数量,a(n-2)为上上个月的兔子数量,这个可以生育了
#include<stdio.h>
// a[n] = a[n-1] + a[n-2]
int main()
{
int N;
int a = 1;
int cur=1;
int count =2;
int tmp;
scanf("%d", &N);
if (N==1)
{
printf("1");
}
else
{
while (cur < N)
{
count += 1;
tmp = cur;
cur += a;
a = tmp;
}
printf("%d", count);
}
return 0;
}
7-28 求整数的位数及各位数字之和 (15 分)
解题思路: 循环
#include<stdio.h>
int main()
{
int num;
scanf("%d", &num);
int cnt=0, sum=0;
while (num>0)
{
cnt += 1;
sum += (num % 10);
num /= 10;
}
printf("%d %d", cnt, sum);
return 0;
}
7-29 二分法求多项式单根 (20 分)
解题思路: 二分查找方法了,注意精度
#include<stdio.h>
float f(float a3, float a2, float a1, float a0, float x)
{
float f = a3 * x * x * x + a2 * x * x + a1 * x + a0;
return f;
}
int main()
{
float a3, a2, a1, a0;
scanf("%f %f %f %f", &a3, &a2, &a1, &a0);
float a, b, res;
float mid;
float tmp;
scanf("%f %f", &a, &b);
while (1)
{
mid = (a+b) / 2;
if ((b-a) < 0.01)
{
res = mid;
printf("%.2f", res);
break;
}
else
{
tmp = f(a3,a2,a1,a0,mid);
if (tmp == 0.0)
{
res = mid;
printf("%.2f", res);
break;
}
else if (f(a3,a2,a1,a0,a) * tmp <= 0)
{
b = mid;
}
else
{
a = mid;
}
}
}
return 0;
}
7-30 念数字 (15 分)
解题思路: 循环+分支
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
if (n<0) {printf("%s ", "fu"); n *= -1;}
int count = 0;
int mark = 1;
int t = n;
while (t>0)
{
count ++;
mark *= 10;
t /= 10;
}
mark /= 10;
if (n==0) printf("%s", "ling");
else
{
while (mark >= 1)
{
t = n / mark;
switch (t)
{
case 0:
printf("%s", "ling");
break;
case 1:
printf("%s", "yi");
break;
case 2:
printf("%s", "er");
break;
case 3:
printf("%s", "san");
break;
case 4:
printf("%s", "si");
break;
case 5:
printf("%s", "wu");
break;
case 6:
printf("%s", "liu");
break;
case 7:
printf("%s", "qi");
break;
case 8:
printf("%s", "ba");
break;
case 9:
printf("%s", "jiu");
break;
}
if (mark != 1)
{printf(" ");}
n = n % mark;
mark /= 10;
}
}
return 0;
}
7-31 掉入陷阱的数字 (15 分)
解题思路: 循环,变量一定切勿忘记初始化,伤心的泪
#include <stdio.h>
int cal(int n)
{
int sum=0;
while (n)
{
sum += n % 10;
n /= 10;
}
return 3 *sum + 1;
}
int main()
{
int n;
scanf("%d", &n);
int cnt = 1;
int tmp;
do
{
tmp = cal(n);
printf("%d:%d", cnt, tmp);
cnt += 1;
if (tmp == n)
{
break;
}
else
{
printf("\n");
n = tmp;
}
}while (1);
return 0;
}
7-32 求交错序列前N项和 (15 分)
解题思路: 循环,累积求和
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
double sum = 0;
int i;
for (i=1;i<=n;i++)
{
if (i%2==0)
{
sum -= i/(2.0*i-1);
}
else
{
sum += i/(2.0*i-1);
}
}
printf("%.3lf", sum);
return 0;
}
7-33 统计素数并求和 (20 分)
解题思路: c语言基础练习,就暂时不要去考虑各种算法了,老老实实的按照基础内容写码练习,1.判断素数的函数;2.循环遍历区间内的每个数
#include <stdio.h>
#include <math.h>
int isPrime(int n)
{
int i;
int isPrime = 1;
for (i=2;i<=sqrt(n);i++)
{
if (n % i == 0)
{
isPrime = 0;
break;
}
}
return (n == 1) ? 0 : isPrime;
}
int main()
{
int m, n;
scanf("%d %d", &m, &n);
int cnt = 0, sum = 0;
int i;
for (i=m;i<=n;i++)
{
if (isPrime(i))
{
cnt += 1;
sum += i;
}
}
printf("%d %d", cnt, sum);
return 0;
}
7-34 求分数序列前N项和 (15 分)
解题思路: 循环求累和,虽然分子和分母是整数,计算的时候可以设置为int,求和的时候可以类型转换,但始终通不过最后一个例子
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
double sum=0.0;
int i;
int a=2,b=1;
int tmp;
for (i=1; i<=n;i++)
{
sum += ((double)a)/ ((double)b);
tmp = a;
a = a + b;
b = tmp;
}
printf("%.2lf", sum);
return 0;
}
都设置为double型就可以了,有点不理解,毕竟分子分母都是整型(整数),不存在精度问题,唯一可能的是求分子/分母的商时有精度问题,不得其解,交给时间和深入学习来理解吧
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
double sum=0.0;
int i;
double a=2,b=1;
double tmp;
for (i=1; i<=n;i++)
{
sum += a/b;
tmp = a;
a = a + b;
b = tmp;
}
printf("%.2lf", sum);
return 0;
}
7-35 猴子吃桃问题 (15 分)
解题思路: 循环,累积求和问题,只是问法变了,从第N天往第1天倒序方向求和。
#include <stdio.h>
int main()
{
//倒退
int n;
scanf("%d", &n);
int i;
int sum=1;
for (i=n-1;i>0;i--)
{
sum += 1;
sum *= 2;
}
printf("%d", sum);
return 0;
}
7-36 韩信点兵 (10 分)
解题思路: 老老实实的遍历循环就可以了,不要考虑什么算法、数据结构,我们是初学编程的白中之白
#include <stdio.h>
int main()
{
int i=6;
int sum = 0;
while (1)
{
if (i % 6 == 5)
{
if (i % 7 == 4)
{
if (i % 11 == 10)
{
printf("%d", i);
break;
}
}
}
i += 5;
}
return 0;
}
7-37 输出整数各位数字 (15 分)
解题思路: 循环,由于遍历的时候是从低位和高位得出各个数字,可以勇敢数组先存下来,当然也可以高位到低位输出,比如123,除以100即可得出高位的1,剩下23除以10得出2,这个方法也是老师课堂上讲过,前提就是要先去求数的位数,求位数就不断去除以10咯。
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int s[32]={0};
int i = 0;
if (n==0) i+= 1;
while (n)
{
s[i++] = n % 10;
n /= 10;
}
int j;
for (j=i-1;j>-1;j--)
{
printf("%d ", s[j]);
}
return 0;
}
7-38 支票面额 (15 分)
解题思路: 循环吧,重点就是在练习这些基本的概念
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int y, f;
int flag = 0;
for (y=0;y<100;y++)
{
if (flag) break;
for (f=0;f<100;f++)
{
if ( 100 * f + y - n == 200 * y + 2 * f)
{
printf("%d.%d", y, f);
flag = 1;
break;
}
}
}
if (flag==0) printf("No Solution");
return 0;
}
7-39 龟兔赛跑 (20 分)
解题思路: 其实很简单,注意好细节,分支判断即可,且在力扣上也刷了400+的题,但第三遍才完全通过。
#include <stdio.h>
int main()
{
int t;
scanf("%d", &t);
int a=0, b=0;
int time=0;
int relax = 0;
while (1)
{
if (relax == 0 && t - time <= 10)
{
a += 3 * (t-time);
b += 9 * (t-time);
break;
}
else if(relax == 1 && t- time <= 30)
{
a += 3 * (t-time);
break;
}
if (relax == 0)
{
a += 3 * 10;
b += 9 * 10;
time += 10;
if (b > a)
{
relax = 1;
}
}
else
{
a += 3 * 30;
time += 30;
relax = 0;
}
}
if (a > b)
{
printf("@_@ %d", a);
}
else if (a < b)
{
printf("^_^ %d", b);
}
else
{
printf("-_- %d", a);
}
return 0;
}
7-40 到底是不是太胖了 (10 分)
解题思路: 还是条件判断,分支选择
#include <stdio.h>
#include <math.h>
void check(float h, float w)
{
float std = (h-100) * 0.9 * 2;
float sub = fabs(w-std);
if (sub < std * 0.1)
{
printf("You are wan mei!\n");
}
else if (w>std)
{
printf("You are tai pang le!\n");
}
else
{
printf("You are tai shou le!\n");
}
}
int main()
{
int n;
scanf("%d", &n);
float h, w;
float i;
for (i=0;i<n;i++)
{
scanf("%f %f", &h, &w);
check(h,w);
}
return 0;
}
7-41 计算阶乘和 (10 分)
解题思路: 1.循换计算每个阶乘即可;2.计算n!的时候,是不是(n-1)!的阶乘已经计算过了,就不用再从头计算了。
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int sum, pre;
sum = 1;
pre = 1;
int i;
for (i=2;i<=n;i++)
{
sum += pre * i;
pre *= i;
}
printf("%d", sum);
return 0;
}
7-42 整除光棍 (20 分)
解题思路:
这道题我是放到最后来做的,说句实话,不看提示还好,一看提示其实把自己给绕进去了。我之前是用python的,从没有考虑过大数计算(精度范围什么的),所以对c就有点真心不习惯。看到提示,嗯,妥妥的大数运算,我又不懂,只依稀好像听说过大数运算的时候,c语言可以用数组,好吧,就被绕道数组里面了,逐个增加1的个数,然后重新整除x,然后bug就多了,始终修改不成功。
好吧,我承认还是我太菜了!
不过,突然灵光一现,这道题根本不用考虑大数计算啊,我们只需要知道1的个数就行了,不论有多少个1,就像小学的时候学竖式除法的时候,不管你被除数有多大,不都是一点点的去除吗?对不对?比如111111 /13 ,不是先用111/13,然后余再去个1继续除下去?此题不也是如此吗?先初始化被除数a=1,如果小于x,就增加1的位数,10a+1,直到大于x,然后开始除法运算,因为输入的x<1000,所以a肯定不会超出精度范围,把a/x的商存下来,如果余为零,则找到了结果(这个时候循环一遍,把存的结果输出就可以,甚至可以不存,根据输出的格式要求,完全可以每一步就输出),如果不为0,则a等于余数,并则加一个位数,不还是10a+1,继续循环。
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
int num[1000]={0};
int init=1;
int n=1;
while (init<x)
{
n ++;
init = init * 10 + 1;
}
int i=0;
while (1)
{
num[i++] = init/x;
init = init % x;
if (init==0)
{
break;
}
else
{
init = init*10 + 1;
n++;
}
}
int j;
for (j=0;j<i;j++)
{
printf("%d",num[j]);
}
printf(" %d",n);
return 0;
}
7-43 Shuffling Machine (20 分)
解题思路: 根据洗牌规则自动洗牌,不要被英文题目吓到,实在不行谷歌翻译、百度翻译结合着理解。1.先初始化牌组2。输入洗牌规则3.反复洗牌4.输出结果
#include <stdio.h>
int main()
{
int shuff[54];
int i,j;
for (i=0;i<54;i++)
{
shuff[i] = i;
}
int n,index;
scanf("%d",&n);//Ï´ÅÆ´ÎÊý
int res[54];
int change[54];
for (i=0;i<54;i++)
{
scanf("%d",&index);
change[i] = index-1;
}
for (i=0;i<n;i++)
{
for (j=0;j<54;j++)
{
index = change[j];
res[index] = shuff[j];
}
for (j=0;j<54;j++)
{
shuff[j] = res[j];
}
}
for (j=0;j<54;j++)
{
if (shuff[j]<13)
{
printf("S%d",shuff[j]+1);
}
else if (shuff[j]<26)
{
printf("H%d",shuff[j]+1-13);
}
else if (shuff[j]<39)
{
printf("C%d",shuff[j]+1-26);
}
else if (shuff[j]<52)
{
printf("D%d",shuff[j]+1-39);
}
else
{
printf("J%d",shuff[j]+1-52);
}
if (j!=53)
{
printf(" ");
}
}
return 0;
}
7-44 黑洞数 (20 分)
解题思路: 1.先重排;2.循环结束条件,重排后的数和重排前一致
#include <stdio.h>
#include <string.h>
int reshape(int i, int n)
{
int a,b,c;
int tmp;
a = n/100;
b = n%100/10;
c = n%10;
if (a<b)
{
tmp = a;
a = b;
b = tmp;
}
if (a<c)
{
tmp = a;
a = c;
c = tmp;
}
if (b<c)
{
tmp = b;
b = c;
c = tmp;
}
int max_n = a*100+b*10+c;
int min_n = c*100+b*10+a;
int diff = max_n - min_n;
if (diff!=n || i==1)
printf("%d: %d - %d = %d\n",i,max_n,min_n,diff);
return diff;
}
int main()
{
int n;
scanf("%d",&n);
int cnt = 0;
int t,tmp;
while (1)
{
cnt ++;
t = reshape(cnt, n);
if (t==n) break;
n = t;
}
return 0;
}
7-45 找完数 (20 分)
解题思路: 1.同找素数一样,循环判断是否为因数,是则加起来或者存起来最后一起加2.如果因数之和等于数本身,则为完数3.需要注意的是,设立标志位flag判断是否一个完数也没有,其实代理可以将flag表示为完数个数,如果为0则输出none
#include <stdio.h>
int factor(int n)
{
int fac[n];
int cnt=0;
int i;
for (i=1;i<=n/2;i++)
{
if (n%i==0)
{
fac[cnt++] = i;
}
}
int sum=0;
for (i=0;i<cnt;i++)
{
sum += fac[i];
}
int flag = 0;
if (sum==n)
{
printf("%d =", n);
for (i=0;i<cnt-1;i++)
{
printf(" %d +",fac[i]);
}
printf(" %d\n",fac[i]);
flag = 1;
}
return flag;
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
int i;
int flag = 0;
for (i=m;i<=n;i++)
{
if (factor(i) == 1)
flag = 1;
}
if (flag == 0)
{
printf("None");
}
return 0;
}
7-46 爬动的蠕虫 (15 分)
解题思路: 认真仔细就可以了,就是一个分支判断,一分钟上爬,一分钟下落
#include <stdio.h>
int main()
{
int n,u,d;
scanf("%d %d %d",&n,&u,&d);
int i;
int sum=0;
for (i=0;;i++)
{
if (i%2==0)
{
sum += u;
if (sum>=n)
{
break;
}
}
else
{
sum -= d;
}
}
printf("%d",i+1);
return 0;
}
7-47 二进制的前导的零 (10 分)
解题思路: 1.如果为负数,则最高位符号位则为1,无前导0;2.如果为0,则前导0有32个;3.如果为正数,先依次从高位判断,如果当前数大于pow(2,i),则表示该为为最靠前的1,则前导0有31-i个,从第31位(索引为30)开始判断,因为最高位为符号位,肯定为0当正数的情况下
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
if (n<=0)
{
if (n==0) printf("32");
else printf("0");
return 0;
}
int i;
int res;
for (i=30;i>-1;i--)
{
res = pow(2,i);
if (n>=res)
{
printf("%d\n",31-i);
break;
}
}
return 0;
}
7-48 求组合数 (15 分)
解题思路: 1.注意精度,题目已经提示;2.求三个阶乘
#include <stdio.h>
double fact(double n)
{
double res = 1;
double i;
for (i=1;i<=n;i++)
{
res *= i;
}
return res;
}
int main()
{
double m,n;
scanf("%lf %lf",&m,&n);
double result = fact(n)/(fact(m)*(fact(n-m)));
printf("result = %.lf",result);
return 0;
}
7-49 Have Fun with Numbers (20 分)
解题思路: 快乐数:1.使用数组存数以及乘以2;2.将得到的结果中的数和原数中的数字对比
#include <stdio.h>
#include <string.h>
int main()
{
char start[20];
char end[20];
scanf("%s",start);
int cnt,i,s;
cnt = strlen(start);
int carry=0,flag=1;
for (i=cnt-1;i>-1;i--)
{
s = (start[i]-'0')*2+carry;
end[i] = s%10+'0';
carry = s/10;
}
int j;
for (i=0;i<cnt;i++)
{
for (j=0;j<cnt;j++)
{
if (end[i]==start[j])
{
start[j]='a';
break;
}
}
}
for(i=0;i<cnt;i++)
{
if (start[i]!='a')
{
flag = 0;
break;
}
}
if (flag==1 & carry==0)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
if (carry!=0)
{
printf("%c",carry+'0');
}
for (i=0;i<cnt;i++)
{
printf("%c",end[i]);
}
return 0;
}
7-50 输出华氏-摄氏温度转换表 (15 分)
解题思路: 循环、仔细耐心细心认真
#include <stdio.h>
#include <math.h>
int main()
{
int lower, upper;
scanf("%d %d",&lower,&upper);
if (lower > upper)
{
printf("Invalid.");
}
else
{
printf("fahr celsius\n");
int i;
for (i=lower;i<=upper;i+=2)
{
printf("%d%6.1f\n",i,5*(i-32)/9.0);
}
}
return 0;
}
7-51 求奇数分之一序列前N项和 (15 分)
解题思路: 注意精度范围,整型与整型进行运算结果为整型,故是1.0/而不是1/
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
int i;
double sum = 0.0;
for (i=1;i<=n;i++)
{
sum += 1.0/(2*i-1);
}
printf("sum = %.6lf", sum);
return 0;
}
7-52 求简单交错序列前N项和 (15 分)
解题思路: 循环,注意精度
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
int i;
int flag = 1;
double sum = 0.0;
for (i=0;i<n;i++)
{
sum += flag * 1.0/(3*i+1);
flag *= -1;
}
printf("sum = %.3lf", sum);
return 0;
}
7-53 生成3的乘方表 (15 分)
解题思路: 循环,仔细认真,注意输出格式
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
int i;
int r;
for (i=0;i<=n;i++)
{
r = pow(3,i);
printf("pow(%d,%d) = %d\n",3,i,r);
}
return 0;
}
7-54 求阶乘序列前N项和 (15 分)
解题思路: 有个小技巧,每个阶乘不用全部重新算,当前阶乘的结果等于上一个阶乘结果乘以当前序号
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
int pre = 1;
int i;
int sum = 0;
for (i=1;i<=n;i++)
{
pre *= i;
sum += pre;
}
printf("%d",sum);
return 0;
}
7-55 查询水果价格 (15 分)
解题思路: 分支选择,根据不同输入输出不同结果
#include <stdio.h>
#include <math.h>
int main()
{
printf("[1] apple\n");
printf("[2] pear\n");
printf("[3] orange\n");
printf("[4] grape\n");
printf("[0] exit\n");
int n;
scanf("%d",&n);
int cnt = 0;
float res;
while (cnt<5 && n!=0)
{
switch (n)
{
case 1:
res = 3.00;
break;
case 2:
res = 2.50;
break;
case 3:
res = 4.10;
break;
case 4:
res = 10.20;
break;
default:
res = 0.00;
}
printf("price = %.2f\n", res);
cnt += 1;
scanf("%d",&n);
}
return 0;
}
7-56 求给定精度的简单交错序列部分和 (15 分)
解题思路: 一直循环,并求和,直到某一项小于精度则退出循环,使用flag来表示正负的变化。
#include <stdio.h>
#include <math.h>
int main()
{
double eps;
scanf("%lf",&eps);
double num;
double fm = -2;
int flag = 1;
double sum = 0.0;
while (1)
{
fm += 3;
num = 1.0/fm;
sum += num * flag;
flag *= -1;
if (num<=eps)
{
break;
}
}
printf("sum = %.6lf",sum);
return 0;
}
7-57 求e的近似值 (15 分)
解题思路: 一样的,只是阶乘结果做分母
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
double sum = 1;
int i;
double pre = 1;
for (i=1;i<=n;i++)
{
pre *= i;
sum += 1.0/pre;
}
printf("%.8f", sum);
return 0;
}
7-58 求幂级数展开的部分和 (20 分)
解题思路: 一样的道理,递增并求和,直到小于精度
#include <stdio.h>
#include <math.h>
int main()
{
double eps = 0.00001;
double x;
scanf("%lf",&x);
double sum=1,fm=1;
double i = 1;
double tmp;
while (1)
{
fm *= i;
tmp = pow(x,i)/fm;
sum += tmp;
if (tmp<eps)
{
break;
}
i ++;
}
printf("%.4lf",sum);
return 0;
}
7-59 打印菱形图案 (15 分)
解题思路: 这个没悬念,控制打印输出就可以了
#include <stdio.h>
#include <math.h>
void my_print(int m, int n)
{
int i;
for (i=0;i<m;i++)
{
printf(" ");
}
for (i=0;i<n;i++)
{
printf("* ");
}
printf("\n");
}
int main()
{
int n;
scanf("%d",&n);
int mid = n/2;
int i,j;
for (i=0;i<=mid;i++)
{
my_print(mid-i,2*i+1);
}
for (i=mid-1;i>-1;i--)
{
my_print(mid-i,2*i+1);
}
return 0;
}
7-60 Welcome to You! (5 分)
解题思路: 打印输出就可以了啊
#include <stdio.h>
int main()
{
printf("Welcome to You!");
return 0;
}
7-61 Programming in C is fun! (5 分)
解题思路: printf即可
#include <stdio.h>
int main()
{
printf("Programming in C is fun!");
return 0;
}
7-62 计算物体自由下落的距离 (5 分)
解题思路: 基本的乘法及小数点保留
#include <stdio.h>
int main()
{
printf("height = %.2lf",5.0*9);
return 0;
}
7-63 高空坠球 (20 分)
解题思路: 注意 分清第i次落地和第i次反弹
#include <stdio.h>
int main()
{
double h;
int n;
scanf("%lf %d",&h,&n);
int i;
double dis=0.0,hight=0.0;
for (i=1;i<=n;i++)
{
if (i==1)
{
hight = h;//下一次落地前通过的距离,高度的2呗
dis += hight;
}
else
{
dis += hight;
hight /= 2.0;
}
}
printf("%.1lf %.1lf",dis,hight/2.0);
return 0;
}
7-64 统计大写辅音字母 (15 分)
解题思路: 条件判断,累加
#include <stdio.h>
#include <math.h>
int main()
{
char s[81];
scanf("%[^\n]s", s);
int i=0;
int cnt = 0;
while (s[i]!='\0')
{
if (s[i]>='A' && s[i]<='Z' && s[i]!='A' && s[i]!='E' && s[i]!='I' && s[i]!='O' && s[i]!='U')
{
cnt ++;
}
i++;
}
printf("%d", cnt);
return 0;
}
7-65 字符串替换 (15 分)
解题思路: 转换,离A越近的字符,转换后离Z越近,故新转换后的字符为Z-(s[i]-‘A’)
#include <stdio.h>
#include <math.h>
int main()
{
char s[81];
scanf("%[^\n]s", s);
int i=0;
while (s[i]!='\0')
{
if (s[i]>='A' && s[i]<='Z')
{
printf("%c",'A'+25-(s[i]-'A'));
}
else
{
printf("%c",s[i]);
}
i++;
}
return 0;
}
7-66 时间换算 (15 分)
解题思路: 先秒钟加经过的秒数,60位进制进行换算
#include <stdio.h>
#include <math.h>
int main()
{
int h,m,s;
scanf("%d:%d:%d",&h,&m,&s);
int gap;
scanf("%d",&gap);
s += gap;
m += s/60;
s = s % 60;
h += m/60;
m = m % 60;
h = h%24;
printf("%0.2d:%0.2d:%0.2d",h,m,s);
return 0;
}
7-67 What is a computer? (5 分)
解题思路: 直接printf
#include <stdio.h>
int main()
{
printf("What is a computer?");
return 0;
}
7-68 求N分之一序列前N项和 (15 分)
解题思路: 注意精度范围计算过程中,使用1.0除而不去1除,因为1为int型变量
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
int i;
double sum = 0.0;
for (i=1;i<=n;i++)
{
sum += 1.0/i;
}
printf("sum = %.6lf",sum);
return 0;
}
7-69 换硬币 (20 分)
解题思路: 没什么好说的,依次遍历,如果等于要换的金额,则满足条件。
#include <stdio.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
int i,j,z;
int cnt = 0;
for (i=n/5;i>=1;i--)
{
for (j=n/2;j>=1;j--)
{
for (z=n;z>=1;z--)
{
if (5*i+2*j+z==n)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,z,i+j+z);
cnt ++;
}
}
}
}
printf("count = %d",cnt);
return 0;
}
7-70 输出三角形面积和周长 (15 分)
解题思路: 第一步先判断是否能构成三角形,第二步使用周长公式计算周长和面积。
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if ((a+b)<=c || (a+c)<=b || (b+c)<=a)
{
printf("These sides do not correspond to a valid triangle");
}
else
{
double s = (a+b+c)/2.0;
printf("area = %.2f; perimeter = %.2f", sqrt(s*(s-a)*(s-b)*(s-c)),2*s);
}
return 0;
}