Chapter06

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值