c语言中怎么处理一个特别大的数据的运算
最简单的办法是将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,
然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。但是这样做效率很低,
因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有
数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志
及中间结果。其优点是算法符合人们的日常习惯,易于理解。
C语言简介:
是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言特点:
1、C语言是一个有结构化程序设计、具有变量作用域递归功能的过程式语言。
2、C语言传递参数均是以值传递,另外也可以传递指针。
3、不同的变量类型可以用结构体组合在一起。
4、只有32个保留字,使变量、函数命名有更多弹性。
5、部份的变量类型可以转换,例如整型和字符型变量。
6、通过指针,C语言可以容易的对存储器进行低级控制。
7、预编译处理让C语言的编译更具有弹性。
//我的计算器只能计算 乘法 加法太简单了自己,拿我的程序自己去改
//可以计算最大100位乘100位的数字
//修改程序第2行的abc的数组大小可以把计算数据大小改成无限大
//所有的注释掉的输出都是在写程序的时候自己来看的
分成三部分
第一部分超大数存储 因为数据太大 超过了各种类型的存储 longlong 大概能存储20位
所以用数组来存储 每一位存入的一个数组中
例如你输入 123456789
a[0]=9
a[1]=8
a[2]=7
...
a[8]=1
第二部分 计算
用小学的方法 一个一个数去计算 a[0]*b[0]的值存入c[0]中,如果c[0]大于10 就往前进一位,然后计算a[1]*b[0] 的值 存入 c[1] 中如果大于十就进位 如此类推 挨个计算
第三部输出 这个没什么好说的 自己看程序吧
#include<iostream>
using namespace std;
#include<stdio.h>
int main ()
{
int i,j,k,l,A,B,C;
char a[100],b[100],c[200]={0};
int x,y,z;
//-------------------------第一个数 输入步骤------------------------------------------------
cout<<"输入第一个数\n"; //输入第一个数 输入123
cin>>a; // a[0]=1百位 a[1]=2十位 a[2]=3个位
//cout<<"输入的数据为";
for(i=0;a[i]!='\0';i++) //判断位数
{
//cout<<a[i];
//printf("%c",a[i]);
}
//cout<<"\n数据为"<<i<<"位\n";
A=i;
for(i=0;i<=(A-1)/2;i=i+1) //把第一个数据反向存储
{
k=a[i];
a[i]=a[A-i-1];
a[A-i-1]=k;
}
for(i=0;i<=A-1;i++) //测试第一个数据方向
{
//cout<<"第"<<i<<"个数字为"<<a[i]<<endl;
}
//--------------------------第二个数输入步骤---------------------------------------------
cout<<"输入第二个数\n"; //输入第二个数
cin>>b;
//cout<<"输入的数据为";
for(i=0;b[i]!='\0';i++) //计算第二个数的位数
{
//cout<<b[i];
}
//cout<<"\n数据为"<<i<<"位\n";
B=i;
for(i=0;i<=(B-1)/2;i=i+1) //把第二个数据反向存储
{
k=b[i];
b[i]=b[B-i-1];
b[B-i-1]=k;
}
for(i=0;i<=B-1;i++) //测试第二个数据方向
{
//cout<<"第"<<i<<"个数字为"<<b[i]<<endl;
}
//-------------------------------核心计算步骤------------------------------------------
for(i=0;i<=B-1;i++)
{
for(j=0;j<=A-1;j++)
{
//printf("a的值为%d b的值为%d\n",a[j]-48,b[i]-48);
x=(a[j]-48)*(b[i]-48); //计算相乘的结果
k=i+j; //计算存储的数组c的位置
c[k]=c[k]+x; //计算存储完成后的值
x=c[k];
//printf("第%d位为%d\n",k,c[k]);
for(l=0;c[k+l]>=10;l++) //循环进位
{
//printf("第%d位为%d",k+l,c[k+l]);
c[k+l]=c[k+l]%10;
c[k+l+1]=x/10+c[k+l+1];
x=c[k+l+1];
}
}
}
//----------------------------------输出步骤------------------------------------------------
for(i=19;c[i]==0;i--) //计算结果数组的中的位数
{
//printf("第%d个数字为%d\n",i,c[i]);
if(c[i]==0)
c[i]='\0';
}
//cout<<"输出的结果为"<<i+1<<"位\n";
j=i+1;
/* for(i=0;i<=j-1;i++) //测试第三个数据方向
{
cout<<"第"<<i<<"个数字为";
printf("%d\n",c[i]);
} */
for(i=0;i<=(j-1)/2;i=i+1) //把数据反向存储
{
k=c[i];
c[i]=c[j-i-1];
c[j-i-1]=k;
}
/* for(i=0;i<=j-1;i++) //测试第三个数据方向
{
cout<<"第"<<i<<"个数字为";
printf("%d\n",c[i]);
} */
for(i=0;i<j;i++)
{
printf("%d",c[i]);
}
cout<<"\n结果共计"<<j<<"位";
}
2013-11-10
2013-11-10
#include<stdlib.h>
void add(char a[],int c,char b[],int d);
void decrease(char a[],int c,char b[],int d);
int max(char a[],char b[],int c);
void multiply(char a[],int c,char b[],int d);
void divide(char a[],int c,char b[],int d);
int main()
{
char a[100]={0},b[100]={0};
a[0]=b[0]=0;
int c=1,d=1;
while(1){
scanf("%c",&a[c]);
if(a[c]=='+'||a[c]=='-'||a[c]=='*'){
while(1){
scanf("%c",&b[d]);
if(b[d]=='\n'){break;}
b[d]-=48;
d++;
}
break;
}
a[c]-=48;
c++;
}
switch(a[c]){
case '+' :add(a,c-1,b,d-1); break;
case '-' :
if(c>d)
{
decrease(a,c-1,b,d-1); break;}
else if(c<d){
printf("-");
decrease(b,d-1,a,c-1);
break;
}
if(c==d){
if(max(a,b,c)==1) {
decrease(a,c-1,b,d-1); break;
}
else {
printf("-");
decrease(b,d-1,a,c-1);
break;
}
}
case '*' : multiply(a,c-1,b,d-1);
break;
}
getchar();
return 0;
}
void add(char a[],int c,char b[],int d)
{ int e=c,f=d,i=1;
if(c>=d){
while(d>0)
{
a[c]+=b[d];
if(a[c]>9){
a[c-1]++;
a[c]%=10;
if(c==1) i=0;
}
c--;
d--;
}
for(;i<=e;i++)
{
printf("%d",a[i]);
}
}
else {
while(c>0)
{
b[d]+=a[c];
if(b[d]>9){
b[d-1]++;
b[d]%=10;
if(d==1) i=0;
}
c--;
d--;
}
for(;i<=f;i++)
{
printf("%d",b[i]);
}
}
}
void decrease(char a[],int c,char b[],int d)
{
int i=1,h=c;
while(d>0){
a[c]-=b[d];
if(a[c]<0){
a[c-1]--;
a[c]+=10;
}
c--;
d--;
}
while(a[i]==0){i++;}
for(;i<=h;i++){
printf("%d",a[i]);
}
}
int max(char a[],char b[],int c)
{
int h=1;
for(int i=1;i<c;i++)
{
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return 0;
}
return 2;
}
void multiply (char a[],const int c,char b[],const int d)
{
int g[100][100]={0};
int result[100]={0};
int e=c,f=d,;
if(a[1]==0||b[1]==0){
printf("0");
exit(0);
}
for(int i=1;i<=c;i++){
for(int h=1;h<=d;h++){
if(a[e]==0) break;
g[i][h+i-1]=g[i][h+i-1]+a[e]*b[f];
if(g[i][h]>9) {
g[i][h+1]=g[i][h+1]+g[i][h]/10;
g[i][h]%=10;
}
f--;
}
f=d;
e--;
}
e=c+d;
if(g[d][e]==0){ e--;}
for(int k=1;k<=e;k++){
for(int q=1;q<=c;q++){
result[k]+=g[q][k];
}
if(result[k]>9) {
result[k+1]=result[k+1]+result[k]/10;
result[k]%=10;
}
}
while(e>0){
printf("%d",result[e]);
e--;
}
}