想问一下每一步的意思以及有没有其他的方法做,我觉得这个循环的我不太明白为什么我想问问看有没有更通俗易懂的求法
基于ChatGPT:
这段代码实现了回文数的查找,具体解释如下:
#include<stdio.h>
表示引入标准输入/输出库头文件。int main()
是主函数的定义,程序从这里开始运行。int n,i,sum,a;
定义了四个整型变量 n、i、sum、a,分别表示输入的数字总数、循环计数器、记录每个数字反向排列的和、当前循环的数字。int b=0;
定义了一个初始值为 0 的整型变量 b,用于计数每个回文数的个数。scanf("%d",&n);
通过键盘输入整型变量 n 的值。for(i=0;i<=n;i++)
循环执行 n 次(包括 0),i 从 0 开始每次累增 1。a=i
将变量 i 赋值给变量 a,用于计算当前数字的反向排列的值。sum=0;
将 sum 的值初始化为 0。while(a)
当 a 不为 0 时循环执行下面的语句。sum=sum*10+a%10;
a%10 表示取 a 的个位数,sum*10 表示将 sum 左移一位,再加上个位数,这样就将个位数加入反向排列的和中。a=a/10;
a/10 表示将 a 右移一位,提交下一次循环。if(sum==i)
如果当前数字的反向排列的和与当前数字本身相等,则该数字是回文数。printf("%d",i);
输出当前回文数。b++;
将 b 累加 1,表示找到了一个回文数。if(b/10==1)
如果找到的回文数的个数达到 10 个,则输出一个换行符,并将 b 的值重置为 0。return 0;
程序结束。这个是判断0到n之间的回文数,这个办法是求回文数比较简单的办法了,其他还有使用数组和转换为字符串来比较的办法。
注释如下:
参考链接:
#include <stdio.h>
int main(void){
int n,i,sum,a; // 分别定义要判断的回文数区间上限的数n,循环变量i,回文数变量sum,当前数i的备份变量a
int b=0;
scanf("%d",&n); // 获取要判断回文数的区间上限n
for(i=0;i<=n;i++){ // 遍历0到n之间每一个数,以判断每个数是否为回文数
a=i; // 备份当前的数i到变量a
sum=0; // 存储当前数i的倒序后的数 ,每次判断一个新数前初始化为0
while(a){ // 如果当前a不等于0,则循环提取a的每一个数位,逆向组合成一个新数
sum=sum*10+a%10; //提取a的个位,累加到sum中,同时累加sum前一次的值*10,已达到将a倒序组合成新数
a/=10; // a除以10
}
if(sum==i){ // 如果i和 其倒序后的数相同,则此数是回文数,打印它,同时回文数数量+1
printf("%d,",i);
b++;
}
if(b/10==1){ //每输出10个回文数后,打印一个换行
printf("\n");
b=0;
}
}
return 0;
}
malloc()
申请1G的内存能否成功?判断依据是什么?free
,进程就结束了,那么空间被回收了吗?我们写一段代码来申请1G空间试一试
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
int main()
{
char *s = (char*)malloc(1024*1024*1024);
assert(s! NULL);
printf("main over\n");
exit(0);
}
这是我们执行程序前的资源情况
这是运行程序后
我们发现好像并没有太大的区别产生,这是因为我们申请内存后会在虚拟内存上进行划分,但是只有在真的使用这块空间的时候才会真正在分配物理内存
我们将代码进行修改
memset(s,0,1024*1024*1024);
我们添加这样一段代码,让我们申请到的空间进行清零
再次执行
内存占用增加,随后程序结束,内存释放 (运行过程中,需要对不用的空间进行free,而程序结束会自动将占用的内存释放)
对于该循环部分,其主要实现了两个有序链表的合并,其大致思路为:
初始化三个指针pa, pb, pc,其中,La->next指向第一个有序链表中的第一个节点,Lb->next指向第二个有序链表中的第一个节点,Lc指向新建的链表头L。
如果pa指向的元素的值小于等于pb指向元素的值,则pc指向pa并往后移动,同时若pa值等于pb值的话,pb也向后移动,否则pa向后移动。
否则的话,pc指向pb,pb向后移动。
判断pa和pb是否均为空:若不是的话,说明其中一个链表还有元素,这时将pc指向非空链表的起始位置即可。
具体的代码实现在段落0中给出。
如果想要实现动态顺序表的开头,可以利用malloc,free,calloc以及realloc等函数来实现malloc,free可以用于动态内存的开辟和释放。calloc可以对申请的空间进行初始化操作。realloc则可以对动态申请空间的大小进行调整。具体实现代码可以参考Segment Fault的SeqlistD.h和test.c。在代码中我们初始化了一个动态顺序表s,并通过PushBack,PushFront,PopBack,并且我们还添加了Clear,Insert以及SeqListDSize函数,分别用于清楚所有的数据表,实现元素的插入以及获得元素的个数。若想利用这部分代码则需提前在头文件中声明这些函数。