当前位置:首页 » 服务存储 » 如何用数组存储大数
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

如何用数组存储大数

发布时间: 2022-07-17 15:51:51

c语言用数组存储大型数据的算法

/*
size_a,pa——指向数组a的有效末端
ma——a的最大容量,必须大于na

n=12——求n的阶
p——求阶乘时的当前乘数
*/
#include<stdio.h>
#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].m.h)和低16位(a[pa].m.l),但是的我考虑是多余的!!不用像我这样定义这么复杂的共用体!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
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--].m.l);
for(;pa>=0;pa--)
printf("%04u",a[pa].m.l);
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].b*p为止!

随着结果数值增大,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].b*p+carry;/*计算结果,要考虑来自低位的进位*/
carry=a[i].b/10000;/*计算进位*/
a[i].b=a[i].b%10000;/*计算余数*/
i++;
}
if(carry>0)
a[++pa].b=carry;
}

Ⅱ c语言中超大数如何存储

用数组,比如魔方的排列状态可以用个 unsigned long a[4]来存起来。

Ⅲ 数组存储大数字

/*给你改好了,就一个很小的地方,估计是笔误了,29的时候错了, 估计就是29的时候某一位=10, 结果没往前进位导致的, 改动在代码里注释了*/

#include<stdio.h>
main()
{
int data[4000]={1,1}; //既然是大数阶乘, 这个数组最好大些
int digit=1;
int i,j,k,r;
int n;
printf("请输入阶乘的最大数字\n");
scanf("%d",&n);
for(i=1;i<=n;i++)//依次乘积
{
for(j=1;j<=digit;j++)
data[j]*=i;
for(j=1;j<=digit;j++)
{
if(data[j]>=10)
{
for(r=1;r<=digit;r++)
{
if(data[digit]>=10) //这里是>=10
digit++;//满十进位
data[r+1]+=data[r]/10;
data[r]=data[r]%10;
}
}
}
printf("%d!=",i);
for(k=digit;k>0;k--)
printf("%d",data[k]);
printf("\n");
}
}

Ⅳ 怎样用数组表示大数,

用数组表示大数就是:数组内的每一个成员只表示大数里的一位。
如数组int
a[100]表示:123456789
a[0]为符号位,值为1时为正数,值为-1为负数(值可以自己定义)
a[1]=1;
a[2]=2;
a[3]=3;~~~;a[9]=9;
最后定义一个结束位a[10]=-999;(-999是结束的标志,可以自己定义)
如果要用大数进行运算则要重写四则运算法则。
重写加减法较为简单,乘除法则较为复杂,需要花大量时间设计。
一般来说存储使用字符串数组如:char
a[100],运算时则转化为
数值数组:int
a[100]。[]中的100为数组长度,大数长度必须在100-2的范围内
才能正确表示。数组长度由自己定义。

Ⅳ C语言如何存放大数(超过500位的) 越详细越好

超过500位的话,就必须用到高精度!
比如输入 一个数字 123
那么我们就用一个数组 a[501]={1,2,3};
如果是键盘输入:
scanf("%d",&n);//大数的位数
for(i=1;i<=n;i++) scanf("%1d",&a[i]);//读入每一位
这样就可以了!

Ⅵ 怎么用数组存储一个大数,求教

C语言的系统类型,均有大小的限制。超出这个存储范围,就无法用该类型进行存储。
所以需要根据数据规模,来选择存储类型。
当需要存储的数很大很大,超出所有可以类型可以表示的范围时,比如一个100位的10进制数,就需要用字符串的方式进行存储。这种存储方式,在算法中称为大数存储,对这种大数的计算,称为大数计算。
以下是一个输入最多不超过1000位的10进制数,并将其输出的代码:

1
2
3
4
5
6
7
8
9

#include <stdio.h>
int main()
{
char s[1001];
scanf("%s",s);//输入数据
printf("%s\n",s);//输出读取到的大数。

return 0;
}

Ⅶ c语言中怎么存储一个很大很大的数

C语言的系统类型,均有大小的限制。超出这个存储范围,就无法用该类型进行存储。所以需要根据数据规模,来选择存储类型。

当需要存储的数很大很大,超出所有可以类型可以表示的范围时,比如一个100位的10进制数,就需要用字符串的方式进行存储。这种存储方式,在算法中称为大数存储,对这种大数的计算,称为大数计算。

(7)如何用数组存储大数扩展阅读:

顺序结构:

顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。

例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子里面的水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c = a; a = b; b = c;执行结果是a = 5,b = c = 3如果改变其顺序。

写成:a = b; c = a; b =c;则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算、输出三步曲的程序就是顺序结构。

例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。

Ⅷ C++中如何用数组来表示一个很大的数

额,你就把在x[N]的第一个数存0或者1表示该数的符号,后面如果你不想节约空间的话,你就数组的每一位对应存一个数位。x[1]=1,x[2]=2,x[3]=3,x[4]=8
就可以表示1238这个数了。当然你若觉得这样浪费空间,你可以数组的每一位存几个数:x[1]=123,x[2]=234,x[3]=768,那就表示123234768.

Ⅸ C语言数组存储超大整数

模拟整数除法即可:

#include<stdio.h>
intmain()
{
charstr[101];
intn,i,bcs;
scanf("%d",&n);
getchar();
while(n--){
scanf("%s",str);
bcs=0;
for(i=0;str[i]!='';++i){
bcs=10*bcs+str[i]-'0';
bcs%=9;
}
if(bcs==0){
printf("Y ");
}
else{
printf("N ");
}
}
return0;
}

Ⅹ 怎么用数组保存一个数组里面的多个最大值的位置

首先定义一个获取最大值位置的数组index[7](跟目标数组targetArray[7]的长度一样),用来存储所有最大值的索引位置值,然后遍历targetArray[]获取最大值,此时先不给index[5]进行赋值存储,拿到最大值再遍历一次,再次比较,若比最大值大的或者与最大值相等元素,则对index[5]进行赋值存储起来。最后便得出targetArray[5]的所有最大值位置。
附代码:
int[] targetArray = {1,2,9,3,9,6,7};//目标数组
int max = targetArray[0];//初始化最大值
int[] index = new int[targetArray.length];//存储目标数组所有最大值位置值
for (int i = 1; i < targetArray.length; i++){//第一次遍历获取目标数组最大值
if(targetArray[i] > max) {
max = targetArray[i];
}
}
for (int i = 1; i < targetArray.length; i++){//获取到目标数组最大值后进行第二次遍历目标数组
if(targetArray[i] >= max) {
max = targetArray[i];
index[i] = i;
}
}