这行代码为什么可以不输出最后多余的那个*号
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
因为输出分两步,前一个数字加星号,和最后一个数字,最后输出是一个数字,而没有星号
这段代码的目的是将输入的正整数进行质因数分解并输出结果。循环部分通过逐个判断数字是否能被 i 整除,并且不断将 num 除以 i,直到无法整除为止。这样可以将 num 分解为一系列质因数的乘积。
在循环的过程中,当 i 不等于 num 时,执行内层的 while 循环。当 i 等于 num 时,跳出循环。因此,在最后一次循环时,i 和 num 的值是相等的。
考虑最后一次循环的情况,由于 i 和 num 相等,进入循环后无法满足 while 循环的条件,所以不会输出任何内容。因此,最后一个多余的 * 号不会被输出。
假设输入的正整数为 12:
可以看到,在最后一次循环时,不会输出 * 号,因为在 while 循环中的条件无法满足。
因此,这段代码能够正确地进行质因数分解,并且不输出最后一个多余的 * 号。
#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