/*
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]!='