📄 lint.cpp
字号:
#include<stdio.h>
struct lint //结构体变量
{
unsigned short num[4]; //unsigned short 2字节/16位;num[4]用于存放64位大整数
void inlint(); //输入
void addlint(lint src); //加法
void outlint(); //输出
};
void lint::inlint() //输入
{
char s[30],i,j; //s:输入字符串;i,j分别为循环变量
unsigned l; //unsigned int 4字节/32位
for(i=0;i<4;i++) //数组num初始化为0
num[i]=0;
scanf("%s",s); //输入一个大整数
for(i=0;s[i];i++) //以下循环把10进制大整数转换为65536(=2^16)进制,分两步来做(以115为例,现已有11)
{
for(j=0,l=0;j<4;j++) //第一步:11*10=110
{
l=num[j]*10+(l>>16);//l>>16相当于l整除65536取得的商
num[j]=l; //数组num每一位=其本身乘以10并加上其低一位的进位值
}
for(j=0,l=(s[i]-48)<<16;j<4;j++)//第二步:110+5=115
{//字符0的ASCII码值为48,s[i]-48实现字符到数字的转换
l=num[j]+(l>>16); //数组加上s[i]-48,依次判断是否需要进位,若需要则进位。
num[j]=l;
}
}
}
void lint::addlint(lint src)
{
unsigned l,j;
for(j=0,l=0;j<4;j++)
{
l=num[j]+src.num[j]+(l>>16); //各位相加并加上低一位的进位。
num[j]=l;
}
}
void lint::outlint()
{
unsigned short t[4]; //unsigned short 2字节
short i,j; //short int 2字节
unsigned r[6]; //unsigned int 4字节,数组r的每一位存放10进制数的4位
for(j=0;j<4;j++)
t[j]=num[j];
for(i=0;i<=5;i++) //计算数组r(详细情况见下)
for(j=3,r[i]=0;j>=0;j--)
{
r[i]=(r[i]<<16)+t[j]; //t[0]是高位,t[3]是低位; <<相当于*65536
t[j]=r[i]/10000;
r[i]=r[i]%10000;
}
for(i=5;!r[i]&&i>=0;i--);//寻找不为零的r[i]
if(i<0)
printf("0");
for(;i>=0;i--) //输出10进制数
printf("%4.4d",r[i]);
printf("\n");
}
void main()
{
lint s1,s2,res;
s1.inlint();
s2.inlint();
res=s1;
res.addlint(s2);
res.outlint();
}
/*
假设ABCD转换为10进制数后为algorism
num: ABCD,即num[0]=A,...,num[3]=D,存放的是65536进制的数
algorism=(((0*65536+A)*65536+B)*65536+C)*65536+D
分解ABCD:
A =a*10000+b 其中b为A对algorism低4位的贡献。a*10000对低4位没有贡献。
b*65536+B=m*10000+n 其中n为AB对algorism低4位的贡献。
n*65536+C=p*10000+q 其中q为ABC对algorism低4位的贡献。
q*65536+D=r*10000+s 其中s为ABCD对algorism低4位的贡献。
数组t:ampr,即t[0]=a,...,t[3]=r
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -