用c语言如何实现64位长整型的加减法、32位长整型乘法、64位长整型除法?

Python09

用c语言如何实现64位长整型的加减法、32位长整型乘法、64位长整型除法?,第1张

#include<stdio.h>

#include<string.h>

#define N 1005

int main()

{

char str1[N],str2[N]

int num1[N],num2[N],t,len1,len2,i,j,max

scanf("%d",&t)//测试t组数据,减法就不写了

getchar()

while(t--)

{

memset(str1,0,sizeof(str1))

memset(str1,0,sizeof(str2))

memset(num1,0,sizeof(num1))

memset(num2,0,sizeof(num2))

scanf("%s",str1)//输入第一个数,这个1000位整数相加也没问题,上面自己改长度

scanf("%s",str2)//输入第二个数,因为没有太长的数据类型,用字符串表示大整数

len1=strlen(str1)

len2=strlen(str2)

max=len1>len2?len1:len2

j=0

for(i=len1-1i>=0i--) //这里注意啊,倒着转换,但是num1是正向存每一位的

{

num1[j]=str1[i]-'0'  //转换成数字一个一个存到数组里面

j++

}

j=0

for(i=len2-1i>=0i--)

{

num2[j]=str2[i]-'0'

j++

}

for(i=0i<maxi++)  //一位一位相加

{

num2[i]+=num1[i]     //加到num2数组中

if(num2[i]>=10)  //大于10进位

{

num2[i]-=10

num2[i+1]+=1

}

}

if(num2[max]==1)

printf("%d",num2[max])

for(i=max-1i>=0i--)   //这样就把大整数的每一位算出来了,顺序输出就好

printf("%d",num2[i])

printf("\n")

}

return 0

}

C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。最近25年是使用最为广泛的编程语言。

C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。

简单办法,转double, 再开方。

你的编译器要能全面支持64位无符号整型才行。例如支持 强制转化 unsigned _int64 为 double.

#include<stdio.h>

#include<math.h>

int main(void){

// unsigned _int64 x // 我的编译器支持 支持unsigned

signed _int64 x

double y

printf("input x in hex 0x100:\n")

scanf("%I64x", &x)// 按16进制格式输入。

printf("x=%I64d\n", x) // 按10进制格式输出。

y = (double) x // 我的编译器支持 signed _int64 转double, 不支持unsigned 转double

printf("y=%lf\n",sqrt(y)) // 开平方

return 0

}

-----

scanf("%I64d", &x) // 按10进制格式输入。

============

实际上,double 只有 52 bits 精度,unsigned _int64 会有截断误差。

而 math.h 的sqrt 不支持 unsigned _int64。

也许可以自己编一个迭代 程序,假定 unsigned _int64 y 是平方根,用

(x - y * y ) 趋进 0 的方法 迭代 出 y -- 好像不难。达到 y 精度 为 1。

下面是设想,尚无时间验证:

#include<stdio.h>

#include<limits.h>

#include<math.h>

int main(void){

unsigned _int64 x,y,y1,y2

signed _int64 xs

double z

printf("max signed _int64 is %I64x\n", _I64_MAX)

printf("max unsigned _int64 is %I64x\n", _UI64_MAX)

printf("input x in hex 0x100:\n")

scanf("%I64x", &x)

printf("x=%I64x\n", x)

if (x <= _I64_MAX){

xs = x

z = (double) xs

printf("y=%lf\n",sqrt(z))

} else {

for (y=0y<0xffffffffy=y+0xff) {

if (y*y <= x) y1=y

if (y * y >x) {y2=ybreak}

}

for (y=y1y<=y2y=y++) {

if (y*y <= x) y1=y

if (y*y >x) {y2=ybreak}

}

printf("y1=%I64x y2=%I64x\n",y1,y2) // 输出

}

return 0

}

输入数小于0x7fffffffffffffff 用 double

大于 0x7fffffffffffffff 用 y*y -x

输入输出 用 16 进制数。

1、基本没有区别,仅在少量数据类型比如long和unsigned long上,64位的数据范围更大

2、32位和64位系统基本没有差别,一般用户不可能体会出来差异。

3、C语言出现于1973年,也就是四十多年前,只是学习的话对电脑硬件没什么需求。