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 = 100
for ( 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;
}