6.3.1
(1)打印如下图案
#include <stdio.h> int main() {int i, j;int n = 5; // 定义图案的行数 for (i = 1; i <= n; i++) {// 打印前导空格 for (j = 1; j <= n - i; j++) {printf(" ");}// 打印数字 for (j = 1; j <= i; j++) {printf("%d", i);}// 换行 printf("\n");}return 0;
}
(2)打印如下图案
#include <stdio.h> int main() {int i, j;int n = 5; // 定义图案的行数 for ( i = 1; i <= n; i++){for ( j = 1; j <= i; j++){printf(" ");}for ( j = 1; j <= n - i; j++){fputc('A' + i - 1, stdout);}printf("\n");}return 0;
}
6.3.2
6.3.2.1
#include<stdio.h>
//猴子吃桃问题,采用回溯法
//采用回溯的思想,第十天有一个桃子,那么第九天桃子数量 = (1 + 1)* 2
//第八天的桃子数量 = (第九天的桃子数量 + 1) * 2 …依次类推int main() {int peaches = 1; // 第10天早上剩下的桃子数 int days = 10; // 总共的天数 // 从第10天逆向推算到第1天 for (int day = days; day > 1; day--) {// 每天的桃子数 = (当天剩下的桃子数 + 1) * 2 peaches = (peaches + 1) * 2;}printf("第一天共摘了 %d 个桃子。\n", peaches);return 0;
}
6.3.2.2
#include <stdio.h> int main() { int peaches = 1; // 第10天剩余的桃子数 int day = 10; // 从第10天开始逆向推算 // 逆向推算每天的桃子数量 for (; day > 1; day--) { // 若是奇数天,则桃子数为(当天剩余的桃子数 + 1) * 2 // 若是偶数天,则桃子数为(当天剩余的桃子数 + 2) * 2 // 使用day % 2判断奇偶性,1表示奇数,0表示偶数 peaches = (peaches + (day % 2 == 0 ? 2 : 1)) * 2; } // 输出第一天摘的桃子数量 printf("第一天共摘了 %d 个桃子。\n", peaches); return 0;
}
6.3.3
#include <stdio.h>
#include <math.h> int main() {double grains = 1.0; // 第一格的麦粒数 double totalGrains = 0.0; // 总麦粒数 const int squares = 64; // 棋盘上的格子数 const double grainsPerCubicMeter = 1.42e8; // 1立方米麦子的麦粒数 // 计算总麦粒数 for (int i = 1; i <= squares; i++) {totalGrains += grains;grains *= 2.0; // 每一格的麦粒数是前一格的两倍 }// 计算总麦粒数的立方米数 double cubicMeters = totalGrains / grainsPerCubicMeter;// 输出结果 printf("总麦粒数: %.0f\n", totalGrains);printf("总麦粒数的立方米数: %.2f\n", cubicMeters);return 0;
}
6.3.4
#include<stdio.h>
int CalculateSum(int a, int n);
int main() {int a, n;printf("请输入a,n:");scanf_s("%d %d", &a, &n);printf("sum = %d", CalculateSum(a, n));return 0;
}/// <summary>
/// 计算sum = a + aa + aaa + aa...aa(n个a)
/// </summary>
/// <param name="a">基数</param>
/// <param name="n">数量</param>
/// <returns>sum</returns>
int CalculateSum(int a, int n) {int sum = 0, item = 0;for (int i = 0; i < n; i++){item = item * 10 + a;//构造当前项sum += item;}return sum;}
6.3.5
#include <stdio.h>
double calculate_fee(int minutes);int main() {int minutes;printf("请输入点歌时长(分钟):");scanf_s("%d", &minutes);double fee = calculate_fee(minutes);printf("点歌结束后的付费金额:%.2f元\n", fee);return 0;
}double calculate_fee(int minutes) {double fee = 0.0;const int initial_minutes = 10;const int two_hours = 120;const int six_hours = 360;const double initial_rate = 1.5;const double extended_rate = 1.0;// 处理前10分钟的费用 if (minutes > initial_minutes) {fee += initial_minutes * initial_rate;minutes -= initial_minutes;}else {fee += minutes * initial_rate;minutes = 0; // 如果没有超过10分钟,则剩余分钟数为0 }// 处理10分钟到2小时的费用 if (minutes > two_hours - initial_minutes) {fee += (two_hours - initial_minutes) * extended_rate;minutes -= (two_hours - initial_minutes);}else if (minutes > 0) {fee += minutes * extended_rate;minutes = 0; // 如果没有超过2小时,则剩余分钟数为0 }return fee;
}
6.4.1
#include<stdio.h>
int main() {int num;printf("请输入一个数字:");scanf_s("%d",&num);printf("满足条件的a, b, c如下:\n");for (int a = 0; a <= 9; a++){for (int b = 0; b <= 9; b++){for (int c = 0; c <= 9; c++){if (a * 100 + b * 10 + c + c * 100 + b * 10 + a == num){printf("a = %d, b = %d, c = %d\n", a, b, c);}}}}return 0;
}
6.4.2
#include<stdio.h>
int main() {int x, y, z;//设公鸡数量为x, 母鸡为y, 小鸡为z//则,3x + 2y + 1/3 * z = 100, x + y + z = 100for ( x = 0; x <= 100; x++){for ( y = 0; y <= 100; y++){for ( z = 0; z <= 100; z++){if (3 * x + 2 * y + 1 / 3 * z == 100 && x + y + z == 100) {printf("公鸡数量为: %d, 母鸡数量为: %d, 小鸡数量为: %d\n", x, y, z);}}}}return 0;
}
6.4.3
#include<stdio.h>
#include<math.h>
int main() {int x, y;//由于x不可能超过2,y不可能超过2,故,挨个遍历x,y所有可能得取值即可for (x = 0; x < 3; x++){for (y = 0; y < 2; y++){if (5 * pow(x, 2) + 7 * pow(y, 2) == 23){printf("有整数解,解为: %d\n", x);}}}printf("没有整数解\n");return 0;
}
6.4.4
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h> bool isValidNumber(int num);int main() {for (int i = 123; i <= 987; i++) {if (isValidNumber(i)) {int j = 2 * i;if (j >= 123 && j <= 987 && isValidNumber(j)) {int k = 3 * i;if (k >= 123 && k <= 987 && isValidNumber(k)) {printf("%d, %d, %d\n", i, j, k);}}}}return 0;
}/// <summary>
/// 检查一个数字是否只包含1到9且不重复
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
bool isValidNumber(int num) {int digits[10] = { 0 };while (num > 0) {int digit = num % 10;if (digits[digit] > 0) {return false;}digits[digit]++;num /= 10;}return true;
}
6.4.5
#include<stdio.h>
int main()
{char a, b, c; //保存 a、b、c 的对手名单for (a = 'x'; a <= 'z'; a++) //枚举a对手的所有可能竞争对手{for (b = 'x'; b <= 'z'; b++) //枚举b对手的所有可能竞争对手{if (a != b) //排除a和b与同一个人比赛{for (c = 'x'; c <= 'z'; c++) //枚举c对手的所有可能竞争对手{if (c != a && c != b) //排除c与a、b的对手相同{if (a != 'x' && c != 'x' && c != 'z') //a不和x比, c不和x,z比printf("a-%c b-%c c-%c\n", a, b, c);}}}}}return 0;}
6.4.6(头大)
#include <stdio.h>
#include <string.h>
#include <stdbool.h> bool isAutomorphic(int num);int main() {for (int i = 2; i <= 1000; i++) {if (isAutomorphic(i)) {printf("%d ", i);}}printf("\n");return 0;
}/// <summary>
///检查一个数是否是其平方数的后缀
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
bool isAutomorphic(int num) {char squareStr[50]; // 用于存储平方数的字符串表示 sprintf(squareStr, "%d", num * num); // 将平方数转换为字符串 char numStr[50];sprintf(numStr, "%d", num); // 将原数转换为字符串 int lenNum = strlen(numStr);int lenSquare = strlen(squareStr);// 检查numStr是否是squareStr的后缀 if (lenNum > lenSquare) {return false; // 如果原数比平方数还长,它不可能是后缀 }// 比较numStr和squareStr的最后lenNum个字符 return (strncmp(squareStr + lenSquare - lenNum, numStr, lenNum) == 0);
}
6.4.7
#include <stdio.h>
#include <math.h> int sumOfPowers(int num, int power);int main() {// 找出2位数的Armstrong数 printf("2位数的Armstrong数:\n");for (int num = 10; num < 100; num++) {if (num == sumOfPowers(num, 2)) {printf("%d ", num);}}printf("\n");// 找出3位数的Armstrong数 printf("3位数的Armstrong数:\n");for (int num = 100; num < 1000; num++) {if (num == sumOfPowers(num, 3)) {printf("%d ", num);}}printf("\n");// 找出4位数的Armstrong数 printf("4位数的Armstrong数:\n");for (int num = 1000; num < 10000; num++) {if (num == sumOfPowers(num, 4)) {printf("%d ", num);}}printf("\n");// 找出5位数的Armstrong数 printf("5位数的Armstrong数:\n");for (int num = 10000; num < 100000; num++) {if (num == sumOfPowers(num, 5)) {printf("%d ", num);}}printf("\n");return 0;
}/// <summary>
///计算一个整数的各位数字的n次幂之和
/// </summary>
/// <param name="num"></param>
/// <param name="power"></param>
/// <returns></returns>
int sumOfPowers(int num, int power) {int sum = 0;int temp = num;while (temp > 0) {int digit = temp % 10;sum += pow(digit, power);temp /= 10;}return sum;
}