有关C语言打印输出问题

这行代码为什么可以不输出最后多余的那个*号

img


源代码如下:

main ()
{
    int num;
    int i;
    printf("输入一个正整数:");
    scanf("%d", &num);
    for (i = 2; i <= num; i++)
    {
        if (i != num)
        {
            while (num % i == 0)
            {
                printf("%d*", i);
                num = num / i;
            }
        }
        else
            break;

    }
    printf("%d", num);
}

if (i != num)
也就是不是最后一个数字才会输出 数字 *
而最后一个数字的输出是 printf("%d", num)
因此输出了n个 xxx * 再加上一个 xxx 没有乘号
这个代码其实还有一种思路,就是第一次输出 xxx
之后每次输出 * xxx

因为输出分两步,前一个数字加星号,和最后一个数字,最后输出是一个数字,而没有星号

img

这段代码的目的是将输入的正整数进行质因数分解并输出结果。循环部分通过逐个判断数字是否能被 i 整除,并且不断将 num 除以 i,直到无法整除为止。这样可以将 num 分解为一系列质因数的乘积。

在循环的过程中,当 i 不等于 num 时,执行内层的 while 循环。当 i 等于 num 时,跳出循环。因此,在最后一次循环时,i 和 num 的值是相等的。

考虑最后一次循环的情况,由于 i 和 num 相等,进入循环后无法满足 while 循环的条件,所以不会输出任何内容。因此,最后一个多余的 * 号不会被输出。

假设输入的正整数为 12:

  • 当 i = 2 时,num 可以被 2 整除,输出 "2*”,然后 num 变为 6。
  • 当 i = 3 时,num 不能被 3 整除,不执行 while 循环。
  • 当 i = 4 时,num 不能被 4 整除,不执行 while 循环。
  • 当 i = 5 时,num 不能被 5 整除,不执行 while 循环。
  • 当 i = 6 时,num 可以被 6 整除,输出 "6",然后 num 变为 1。

可以看到,在最后一次循环时,不会输出 * 号,因为在 while 循环中的条件无法满足。

因此,这段代码能够正确地进行质因数分解,并且不输出最后一个多余的 * 号。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7529894
  • 这篇博客也不错, 你可以看下【C语言】深入浅出理解指针及内存与指针的关系(详细讲解+代码展示)
  • 除此之外, 这篇博客: C语言的双向链表头插法和尾插法,指定节点删除中的 测试代码如下 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct DoubleLink {
        int data;
        struct DoubleLink *next;
        struct DoubleLink *prev;
    }Data;
    
    /*打印链表,先next顺序打印,再prev逆序打印*/
    void print_list(Data *head) {
    	if(head == NULL)
    		return;
        printf("next \n");
    	while (head -> next) {
    		printf("%d ",head->data);
    		head = head -> next;
    	}
        printf("%d\n",head->data);
        Data *p = head;
        printf("\nprev \n");
        while (p -> prev != p) {
            printf("%d ",p->data);
            p = p ->prev;
        }
    	printf("\n");
    }
    
    /*尾插法*/
    Data *insert_tail(int n){
        Data *head = (Data *)malloc(sizeof(Data));
        head->next = NULL;
        head -> prev = head;
        Data *r = head;
        while (n --){
            int tmp;
            Data *p = (Data *)malloc(sizeof(Data));
            scanf("%d", &tmp);
            p -> data = tmp;
    
            if (r -> next == NULL) {
                p -> next = NULL;
                p -> prev = r;
                r -> next = p;
            } else  {
                p -> next = NULL;
                p ->prev = r;
                r -> next -> prev = p;
                r -> next = p;
            }
            
            r = p;
        }
        return head -> next;
    }
    
    /*头插法*/
    Data *insert_head(int n) {
        Data *head = (Data *)malloc(sizeof(Data));
        head->next = NULL;
        head -> prev = head;
        Data *r = head -> next;
        while (n--)
        {
            int tmp;
            Data *p = (Data *)malloc(sizeof(Data));
            scanf("%d", &tmp);
            p -> data = tmp;
            if (head -> next == NULL) {
                 p -> next = NULL;
                 p -> prev = head;
                 head -> next = p;
            } else
            {
                p -> next = head -> next;
                p -> prev = head;
                head -> next -> prev = p;
                head -> next = p;
            }
        }
        return head -> next;
        
    }
    
    /*删除链表,删除节点data为2的链表*/
    Data *delete_list(Data *head, int data) {
    	if(head == NULL)
    		return NULL;
        Data *p;
        Data *r = head ;
        while (r->next) {
            if (r-> next ->data == data) {
                p = r->next;
                break;
            }
            r = r->next;
        }
    
        r->next = p -> next;
        p->next->prev = r;
    
        p = NULL;
        return head;
    }
    
    int main()
    {
        printf("construct the double list tail\n");
        Data * head = insert_tail(5);
        print_list(head);
    
        printf("construct the double list head\n");
        Data * tail = insert_head(5);
        print_list(tail);
    
        printf("delete the double list node\n");
    
        Data * test = insert_head(5);
        Data *result = delete_list(test,2);
        print_list(result);
        return 0;
    }
    

    输出结果如下:

    construct the double list tail
    1 2 3 4 5
    
    next 
    1 2 3 4 5
    prev 
    5 4 3 2 1 
    
    construct the double list head
    1 2 3 4 5
    
    next 
    5 4 3 2 1
    prev 
    1 2 3 4 5 
    
    delete the double list node
    1 2 3 4 5
    next 
    5 4 3 1
    prev 
    1 3 4 5 
    
  • 您还可以看一下 朱有鹏老师的宏定义与预处理、函数和函数库-C语言专题第6部分课程中的 4.6.1.C语言预处理理论小节, 巩固相关知识点