用c语言怎样无限开辟内存、或编一个通过无限开辟内存,处理大量数据的程序来让电脑死机。

用c语言怎样无限开辟内存、或编一个通过无限开辟内存,处理大量数据的程序来让电脑死机。,第1张

生成大链表,最好里面用大节点,这样可以加速内存的耗尽,分配时用calloc申请内存,malloc也可以,生成中的节点中多用指针,然后指针不指空值(这样就有可能指到系统区去),这里的用三个do{}while(1)来实现,一个是生成链表,一个是用链表节点值做任意的运算——这两个是同一等级的,还有一个是最外层。这里一定是要用到break的……思路是这样的,你也是这样想的吧,想必我说的就是你想的,只是你在编译是总是不得过,对啊,呵呵,别傻啦,我们能找到的编译器是要做安全性检查的(不光是一些语法的)
除非,你在写之前,自己先写一个编译器来……或者你已经找到了这样的工具

/
size_a,pa——指向数组a的有效末端
ma——a的最大容量,必须大于na
n=12——求n的阶
p——求阶乘时的当前乘数
/
#include
#define
Ma
10000
int
pa;/指向数组a的有效末端/
int
p=2;
int
memory_over=0;
union
data
{
unsigned
long
int
b;
struct
{unsigned
l:16;
unsigned
h:16;
}m;
}a[Ma];
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明1:考虑到result比较长,我用a[Ma]b来存储n!的result,每一位a[pa]b能存储4位10进制数字。
因为我定义的数组是静态的,所以Ma应该足够大。
ps:其实只用定义一个unsigned
long
int
b[Ma];就可以了(直接用b[pa]代替a[pa]b),但是我考虑到可能会访问每一结点b[pa]的高16位(a[pa]mh)和低16位(a[pa]ml),但是的我考虑是多余的!!不用像我这样定义这么复杂的共用体!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
unsigned
int
cashe;
unsigned
int
carry;
void
main()
{
unsigned
int
n;/求n的阶/
void
facto(unsigned
int
n);
printf("Input
n:");
scanf("%u",&n);
/=================开始求阶乘!=============/
a[0]b=1;/初始化/
facto(n);
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:上面这句直接调用facto(n)来求n!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
/========================以下是显示最后结果====================================/
if(memory_over==0)
{printf("the
result
include
%dNO:\n",pa+1);
printf("%u",a[pa--]ml);
for(;pa>=0;pa--)
printf("%04u",a[pa]ml);
printf("\n");
}
getch();
}
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:求阶函数facto(n)说明:
这个函数会不断地调用multiple(),它的作用是每被调用一次就使得a[pa]b与阶数p相乘一次,直到乘完n为止!
{multiple();
p++;/每一轮乘一个阶数p/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
void
facto(unsigned
int
n)
{void
multiple();
pa=0;
while(pa<Ma-1&&p<=n)/容量限制/
{multiple();
p++;/每一轮乘一个阶数p/
}
if(p<=n)
{printf("memory
out!\n");memory_over=1;}/如果当前的存储结果的数组a[Ma]不够用!应提高Ma/
}
/==============================================================================
算法说明3:乘法函数multiple()说明:负责a[pa]b与阶数p相乘。
a[pa]b有很多结点,a[0]b、a[1]b、a[2]b、a[3]b、a[4]b、。。。
当然是从低结点a[0]b开始不断与p相乘,产生的“进位”加到高位a[1]b,直到a[pa]bp为止!
随着结果数值增大,pa个结点的a[]b可能容纳不下结果,所以如果a[pa]b与p相乘后还有“进位”carry,就扩大pa,并把carry放入到新增加的结点:
if(carry>0)
a[++pa]b=carry;
===================================================================================/
void
multiple()
{int
i=0;
carry=0;
while(i<=pa)/i指向当前处理的元素a[i],每一轮用一个位与阶数p相乘/
{a[i]b=a[i]bp+carry;/计算结果,要考虑来自低位的进位/
carry=a[i]b/10000;/计算进位/
a[i]b=a[i]b%10000;/计算余数/
i++;
}
if(carry>0)
a[++pa]b=carry;
}

假定文本文件,全部是 int 数据,空格 分隔。
FILE fp;
int i =0, n;
fp = fopen("jsztxt","r"); //打开文件,用来读。
if (!fp) { 打开失败 的 处理 };
while(1){
fscanf(fp,"%d %d %d", &a[i], &a[i+1],&a[i+2]);
if ( feof(fp) ) break; // 文件终了判断
i=i+3; // 下3个的 起始元素下标
}
fclose(fp); // 关闭文件

1可以用字符串进行处理。
如果需要四则运算,可以通过模拟笔算的方法实现
2字符串用来输入输出,用内存保存数(连续内存,可以是数组)
这个就是大数计算的内容,网络上应该很多。

c语言中用循环来对数组进行处理,一维的用一个循环,二维的用二重循环,以此类推。
比如说你那个是这样做的:
for(i=0;i<3;i++) //用以对数组的行进行遍历
{
for(j=0;j<=2;j++) //用以对行中的数据进行遍历
{m+=a[i][j]: //m的初值是0
printf("%d\n",m);
}
}

1、一般来说,大数都是用字符串来储存,一个字符表示一个数位。大数就是位数多,数值大的意思。通常来说c语言里的基本数据类型范围是有限的,如long型的最大只能表示几十亿,几十亿也就11位数字长度而已。如果用100长的数组表示,假设数组一个元素存数字的一位,那么总位数可以达到100位,这是基本数据类型无法表示的。
2、基本类型的数据范围:
[signed]int :-32768----32767
unsigned int:0---65535
[signed]short[int]:-32767---32768
long[int]:-2^31----(2^31-1)
unsigned long [int]:0---(2^32-1)
float:10^-37-----10^38
double:10^-307-----10^308
long double:10^-4931----10^4932


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13378868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存