如何在c语言中构造一个128位数 C语言怎么实现一个128位的数除以64位数

作者&投稿:赞俩 (若有异议请与网页底部的电邮联系)
在C语言中,并没有任何数据类型可以表示精确的128位数。所以要表示128位数,就必须用数组模拟。比如,用字符数组模拟,每位字符表示一位数,使用'0'~'9'表示各个位上的数值。


char num[129] = "12345678";
表示数字12345678。 由于128位过长,就不举128位的例子了。
输入输出均可以用字符串的方式。

另外,做计算的话,就必须自己写函数了,如加减乘除模除等,对于这类实现,在算法中称为大数计算,如果需要,可以对此进行搜索,有很多优秀算法。

我写了一个长整数的类,估计会对你有帮助

#include <iostream>
#include <ctime>
#include <deque>
using namespace std;

class very_long_int
{
friend istream& operator >> (istream& input,very_long_int& number); //友元函数,实现长整数的输入
friend ostream& operator << (ostream& output,const very_long_int number); //友元函数,实现长整数的输出
public:
deque<char> digits; //定义一个双端队列用于存储长整数
char least(unsigned i); //得到长整数的最后一位,用于计算加减法
very_long_int operator + ( very_long_int& other_number); //长整数的加法运算
very_long_int operator * ( very_long_int& other_number); //长整数的乘法运算
very_long_int operator = ( very_long_int& other_number); //长整数的赋值运算
very_long_int factor(int i); //阶乘运算
void disp()
{
unsigned int i;
for(i=0;i<digits.size();i++) cout<<(int)digits[i];
cout<<endl;
}
};

istream& operator >> (istream& input,very_long_int& number) //长整数的输入
{

char c;
number.digits.erase(number.digits.begin(),number.digits.end());
do
{
input>>c;
if((c>='0')&&(c<='9'))
number.digits.push_back(c-'0');
}while(c!='X');
return input;
}

ostream& operator << (ostream& output,const very_long_int number) //长整数的输出
{
deque<char>::iterator itr;
//for(itr=number.digits.begin();itr!=number.digits.end();itr++) output<<int(*itr);
for(unsigned i=0;i<number.digits.size();i++) output<<int(number.digits[i]);
output<<endl;
return output;
}

char very_long_int::least(unsigned int i) //取得digits的第i个最低有效位
{
if (i>=digits.size())
return 0;
else
return (digits[digits.size()-i-1]);
}

very_long_int very_long_int::operator +( very_long_int& other_number) //长整数的加法
{
unsigned maxlength;
unsigned carry=0; //进位位
if(digits.size()>other_number.digits.size()) //取得2个操作数的最大位数
maxlength=(unsigned)digits.size();
else
maxlength=(unsigned)other_number.digits.size();
very_long_int result; //定义一个用于保存最终结果的长整数对象

for(unsigned i=0;i<maxlength;i++)
{
unsigned n=least(i)+other_number.least(i)+carry;
result.digits.push_front(n%10);
carry=n/10;
}
if(carry==1)
result.digits.push_front(carry);
return result;
}

very_long_int very_long_int::operator *(very_long_int& other_number) //乘法
{
unsigned carry=0;
very_long_int result,temp;

for(unsigned i=0;i<other_number.digits.size();i++)
{
temp.digits.erase(temp.digits.begin(),temp.digits.end());
carry=0;
for(unsigned j=0;j<digits.size();j++)
{
unsigned n=least(j)*other_number.least(i)+carry;
carry=n/10;
temp.digits.push_front(n%10);
}
if(carry!=0) temp.digits.push_front(carry);
for(unsigned k=0;k<i;k++) temp.digits.push_back(0);
//cout<<"temp:"<<temp<<endl;
result=result+temp;
}
return result;
}

very_long_int very_long_int::operator =(very_long_int& other_number) //赋值
{
digits.erase(digits.begin(),digits.end());
for(unsigned i=0;i<other_number.digits.size();i++)
digits.push_back(other_number.digits[i]);
return *this;
}

very_long_int very_long_int::factor(int i) //阶乘运算
{
very_long_int result,r,r1;
result.digits.push_back(1);
r1.digits.push_back(1);
r.digits.push_back(1);
if(i<=1) return r1;
for(int k=2;k<=i;k++)
{
r=r+r1;
result=result*r;
}
return result;
}

void main()
{
very_long_int num;
int n;
cout<<"求一个数的阶乘(n):"; cin>>n;
long start,stop;
start=(long)time(NULL);
cout<<n<<"的阶乘是:"<<endl<<num.factor(n);
stop=(long)time(NULL);
cout<<"\n所用的时间为:"<<stop-start<<"秒"<<endl;
cin.get();cin.get();

}

128位的数在计算机中属于高精度,用数组解决最直接

用整型数组 或者用字符串

可以用一个128位的数组,

C 如何在类中定义一个128位的int型变量~

首先C中不能定义类class,C中只能定义结构体struct,C++中可以定义类class,而且如果要存储128位的变量,可以计算后存储,比如定义int a[4],这就是一个开辟了128bit的存储单元,自己根据需要存储数值,希望对你有帮助!

用128长度的数组或链表,再用64长度的数组或链表。前者作被除数,后者作除数。每一位用一个char型就可以了,因为每一位运算结果即是用ASCII表示也不会超过127的。做起来不难,麻烦。本人曾做过250位除以多少位来着,忘了。

c语言 一个高难度问题!
答:{ unsigned char bit0 :1;unsigned char bit1 :1;unsignde char bit2 :1;...128个 };解释一下,typedef一般可以加也可以不加,加的话,我们用这个结构体定义对象的话,就不用再加struct。(只在C语言中)内部首先 unsigned char是用来告诉我们我们所定义的位是以无符号char型对齐的,就是每8...

用c语言怎样求一个数的位数?
答:关于c语言如何求一个数的位数如下:在C语言中,计算一个数的位数是一项常见的操作。位数是指一个数的十进制表示中的数字个数。下面我们将介绍一种简单的方法来计算一个数的位数。这种方法利用了整数除法运算的特性。我们可以通过不断地将待计.算的数除以10,直到商为0为止,每进行一次除法运算就将位...

C语言怎么计算一个数有多少位
答:C语言怎么计算一个数有多少位的方法:输入待计算的数x 定义一个数位的变量int n=0;循环,x每次缩小10倍,n=n+1; 最终x会变成0,循环结束 输出n值 代码:include <stdio.h>void main(){ int x,m,n=0; printf("input x: ");scanf("%d", &x ); m=x; //备份原数,供输...

C语言中long double在什么编译器里是128位?
答:long double什么时候都是80位 另外谭浩强的书有很多致命的错误 include <stdlib.h>#include <stdio.h>int main(){ if(((sizeof(long double)*8)==128) printf("long double is %d bytes\1\n",128); else printf("long double is not %d bytes\1\n",128); return 0;}...

c语言编程 输入一个三位数,输出各位数上最大的数字。 例如,输入128,
答:include <stdio.h>void main(){int i,n,k=0;scanf("%d",&n);for(i=1;i<=3;i++){if(k<n%10) k=n%10;n=(n-n%10)/10;}printf("最大数字为%d",k);}

用c语言,编写程序判断一个正整数x在二进制下的位数
答:输入:128,输出:8 include<stdio.h>#include<stdlib.h>#include<string.h>int main(){char a[10000];//定义一个字符型数组,最多可以容纳10000位,可修改 memset(a,'\0',10000*sizeof(char));//对数组初始化 int n;scanf("%d",&n);itoa(n,a,2);//改变成2进制,n是要转化的整数...

c语言如何打出一个数是几位数
答:if ((num >= 0) && (num < 10)) printf("\n\r 1位数");else if ((num >= 10) && (num < 100)) printf("\n\r 2位数");else if ((num >= 100) && (num < 1000)) printf("\n\r 3位数");...

C语言中 char dest [128]什么意思?
答:这是定义一个字符数组,名为dest,共有128个字符变量元素,最多可存储128个字符,用来存储字符串时,最大串长为127(还需1个字节用来存储串结束符'\0')。

c语言 中 声明字符数组时str1[128],为什么要定义其长度为128?
答:长度为128 说明字符缓冲区有可以装 128 个字符, 占128 字节.

C语言里面,char类型是怎么存放-128的啊?
答:正数部分:0:0000 0000 1:0000 0001 127:0111 1111 负数部分:0:0000 0000 -1:1111 1111(总之-1加1溢出后是0)-2:1111 1110(总之-2加1是-1)-128:1000 0000 即-128加上127再加1溢出后是0——C/C++里存放整数的统一性。