1.输入两个整数a和b,计算a+b的和
本题很简单,但是注意此题是多组测试数据,即需要不停的接收系统的测试输入,你都可以计算结果并输出
样例输入:
1 1 10 20
样例输出:
2 30
错误示例:
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
int a, b, c, d;
scanf("%d %d", &a, &b);
scanf("%d %d", &c, &d);
printf("%d\n%d", a + b, c + d);
return 0;
}
初看并看不出有什么大深奥,极大可能写出上面的代码,但是并没有通过测试,原因是并不满足多组测试,它上面的代码只能满足两组数据的相加,所有我们思考该如何改进,使其可以进行多组测试。
改进版1:
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
int a, b;
while (scanf("%d %d", &a, &b) == 2) {
printf("%d\n",a + b);
}
return 0;
}
改进版2:
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
int a, b;
while (scanf("%d %d", &a, &b)) {
printf("%d\n",a + b);
}
return 0;
}
为了使其可以进行多组测试,我们加入了一个循环,循环的作用是在确定scanf的内容是整数时继续经行运算,从而可以做到将两个数相加。
注解:
(scanf("%d %d", &a, &b) == 2 这行代码的意思是当你输入的是两个整型因为它的返回值是2于==2符合,所以循环继续;
scanf("%d %d", &a, &b)的意思是当检查到这两个正整数时,循环继续,这两个式子在这里效果一样。
2.要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.
例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。
样例输入:
China
样例输出:
Glmre
解答:
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char ch1, ch2, ch3, ch4, ch5;
scanf("%c%c%c%c%c", &ch1,&ch2,&ch3,&ch4,&ch5);
printf("%c%c%c%c%c", ch1 + 4, ch2 + 4, ch3 + 4, ch4 + 4, ch5 + 4 );
return 0;
}
主要涉及字符的运算,只要能想到使用字符,和字符加减法,这题还是比较轻松解决的。
3
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
样例输入:
2 4 5 0
样例输出:
2 4 6
采用迭代解法(运行的时间长)
#define _CRT_SECURE_NO_WARNINGS
#include
int countCows(int n) {
if (n <= 0) {
return 0;
}
else if (n <= 3) {
return n;
}
else {
return countCows(n - 1) + countCows(n - 3);
}
}
int main() {
int n;
int years[1000]; // 假设最多输入1000年的年份
int count = 0;
scanf("%d", &n);
// 读取输入年份
while (n != 0) {
years[count] = n;
count++;
scanf("%d", &n);
}
// 计算并输出每年的母牛数量
for (int i = 0; i < count; i++) {
int totalCows = countCows(years[i]);
printf("%d\n", totalCows);
}
return 0;
}
注解:首先我解题,探究母牛的数量,列出以下图表:
年数: 牛数:
我们探索发现规律:
当x>4时:
f(x)=f(x-1)+f(x-3)
根据这个式子,我们决定用递归解决问题
首先建立递归的函数:
int countcow(int i){
if(i<=0){
return 0;
}
else if(i<4){
return i;
}
else{
return countcow(i-1)+countcow(i-3)
}
}
这段函数可以充分演绎
f(x)=f(x-1)+f(x-3)这个方程
接下来我们考虑输出格式的问题:
它的输出格式式连续的,且要求在输入0的时候显示输出;所以我们考虑使用while循环加上数组实现解答;
尤其注意,此时我们将数组的内的值变成count
而count=0;
而在每一次我们输入一次数组时,count++
这是老程序员的经验,希望读者能吸收
有一个小注意:这里的year[]数组保证了正确的输出,它和变量n是绑定的
采用递归+动态规划解法(运行时间较短)
#define _CRT_SECURE_NO_WARNINGS
#include
int countCows(int n) {
int dp[1001];
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
for (int i = 4; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 3];
}
return dp[n];
}
int main() {
int n;
int years[1000];
int count = 0;
scanf("%d", &n);
while (n != 0) {
years[count] = n;
count++;
scanf("%d", &n);
}
for (int i = 0; i < count; i++) {
int totalCows = countCows(years[i]);
printf("%d\n", totalCows);
}
return 0;
}
注解:它减少了运算次数,首先自定义了dp[0],dp[1],dp[2],dp[3],然后通过for循环找出所有的值
补充知识:
迭代:
for
循环、while
循环)来控制代码的执行流程。递归:
迭代和递归各有优缺点,应根据问题的特性和实际需求选择合适的方法。一般来说,迭代通常更直观且效率较高,而递归则更能简化问题的表达和理解,但可能会带来额外的时间和空间开销。
需要注意的是,在某些情况下,迭代和递归可以相互转换,并且有时候使用递归可以更简洁地表达问题的解决思路。但在实际应用中,我们应当根据问题的具体要求和性能需求来选择合适的方法。