如果实现某种图形,我们可以列方程,例如一个零星,我们可以建立坐标

如果实现求位数的话,可以对取lg。

#include <streamio>
#inculde <math.h>

int n = 100;
double dblBitCount = 0.0;

for (int i = 1; i <= n; i++)
{
  dblBitCount = dblBitCount + log10(i);
}

std::cout << (int)ceil(dblBitCount); << std::endl;

system("pause")
  return 0;

goto

  1. goto可以跳出多层循环外

  2. 简化状态间的跳转

  3. 实现多重嵌套条件下的错误处理和资源清理 cpp用try cash代替

#include <stdio.h>

int main() {
    printf("Start\n");
    goto label;  // 跳转到标签 label 处
    printf("This will be skipped\n");

    label:  // 定义标签
    printf("Jumped to label\n");

    return 0;
}

//#输出
//Start
//Jumped to label

goto 语句是一些编程语言中的控制流语句,允许程序无条件地跳转到指定的位置,这个位置通常是由一个标签(label)标识的。在不同的编程语言中,goto 的语法和用法可能会有所不同,但基本原理是相同的。下面是一些关于 goto 语句的详细信息:

1. 基本用法

在使用 goto 时,你需要:

  • 定义一个标签(label),作为跳转的目标。

  • 使用 goto 语句并指定目标标签,实现跳转。

2. 示例

以下是 C 语言中 goto 的一个简单示例:

#include <stdio.h>

int main() {
    printf("Start\n");
    goto label;  // 跳转到标签 label 处,标签名字自定义
    printf("This will be skipped\n");

    label:  // 定义标签
    printf("Jumped to label\n");

    return 0;
}

在这个例子中,程序会输出:

Start
Jumped to label

goto label; 语句使程序跳过了 printf("This will be skipped\n"); 行,直接跳转到标签 label 处继续执行。

3. 使用场景

虽然 goto 语句在现代编程中不常见,但在某些特殊情况下它仍然有用:

  • 错误处理:在某些低级语言(如 C 语言)中,可以使用 goto 来实现多重嵌套条件下的错误处理和资源清理。

  • 状态机实现:某些状态机实现中,goto 可以简化状态间的跳转。

4. 注意事项

尽管 goto 有其使用场景,但滥用 goto 会导致代码难以阅读和维护,形成所谓的“意大利面条代码”(spaghetti code)。因此,在大多数现代编程实践中,建议尽量避免使用 goto,而选择更结构化的控制流语句,如循环、函数调用和异常处理机制。

5. 替代方法

许多编程语言提供了替代 goto 的结构化控制流语句。例如:

  • 循环forwhiledo-while 等。

  • 条件语句ifswitch 等。

  • 函数和方法:通过函数调用实现代码重用和跳转。

if-else和switch-case比较

1. 语法和可读性

Switch-case:

  • 适用于基于单个变量的多分支选择。

  • 语法简洁,结构清晰。

  • 可读性较好,尤其是在有多个分支的情况下。

switch (variable) {
    case value1:
        // code to execute if variable == value1
        break;
    case value2:
        // code to execute if variable == value2
        break;
    // other cases...
    default:
        // code to execute if variable doesn't match any case
}

If-else:

  • 适用于复杂条件和多变量的判断。

  • 可以处理更灵活和复杂的逻辑。

  • 当条件较多时,嵌套的if-else结构可能会变得难以阅读。

if (condition1) {
    // code to execute if condition1 is true
} else if (condition2) {
    // code to execute if condition2 is true
} else {
    // code to execute if none of the above conditions are true
}

2. 性能

  • Switch-case 通常在编译时可以进行优化,特别是在条件值是整数或枚举类型时,性能会较好。编译器可以使用跳转表来实现O(1)的时间复杂度。

  • If-else 的性能取决于条件的复杂性和条件的数量。每个条件都需要进行单独的比较,可能导致O(n)的时间复杂度。

3. 使用场景

Switch-case:

  • 适用于处理固定值的比较(如枚举类型、整数等)。

  • 当需要在多个选项之间进行选择,并且这些选项是离散的、固定的值时,switch-case是更好的选择。

If-else:

  • 适用于处理复杂的条件逻辑,尤其是涉及多个变量或复杂表达式的情况。

  • 当条件不适合用简单的值来表示,或者需要进行范围比较时,if-else更为合适。

示例比较

Switch-case示例:

int day = 3;
switch (day) {
    case 1:
        printf("Monday\n");
        break;
    case 2:
        printf("Tuesday\n");
        break;
    case 3:
        printf("Wednesday\n");
        break;
    default:
        printf("Invalid day\n");
}

If-else示例:

int day = 3;
if (day == 1) {
    printf("Monday\n");
} else if (day == 2) {
    printf("Tuesday\n");
} else if (day == 3) {
    printf("Wednesday\n");
} else {
    printf("Invalid day\n");
}

switch的default

在switch语句中,default是一个可选的分支,用于在所有case条件都不匹配时执行代码。它相当于if-else结构中的最后一个else分支,用来处理所有没有被显式处理的情况。default通常用于提供一个备用的处理路径,以确保程序在遇到未预见的值时仍能正常运行。

示例

以下是一个包含default分支的switch语句示例:

#include <stdio.h>

int main() {
    int number = 5;

    switch (number) {
        case 1:
            printf("Number is 1\n");
            break;
        case 2:
            printf("Number is 2\n");
            break;
        case 3:
            printf("Number is 3\n");
            break;
        default:
            printf("Number is not 1, 2, or 3\n");
    }

    return 0;
}

在这个例子中,如果number的值不是1、2或3,程序将会执行default分支,并输出“Number is not 1, 2, or 3”。

使用default的注意事项

  1. 放置位置default分支可以放在switch语句的任何位置,但通常放在最后,以提高代码的可读性。

  2. break语句:和其他case一样,default分支通常也会以break语句结束,以防止程序继续执行后续的case分支。如果default是最后一个分支,break语句可以省略。

为什么需要default

  1. 处理意外值:在处理意外或未预见的值时,default分支可以提供一个安全网,防止程序因未处理的情况而崩溃或产生错误结果。

  2. 增强健壮性default分支使得程序更加健壮,因为它确保了即使所有显式case都不匹配时,程序仍有合理的处理路径。

总之,default分支在switch语句中起到一个备用和安全保障的作用,确保程序在所有情况都能有合适的处理。