#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年,也就是四十多年前,只是学习的话对电脑硬件没什么需求。