长整数的进制转换论文_贺小龙

长整数的进制转换论文_贺小龙

新疆乌鲁木齐兵团一中 830002

在完成长整数的加减乘除运算时很麻烦,就是做通了也没拿满分。才知道用重载的方法可以直接完成数组和整数间加减乘除运算。

结构体:用结构体内数组储存长整数,用结构体中的变量表示该整数的具体长度。

#include <iostream>/

#include <cstring>/

using namespace std;/

struct hh{/结构体

int n[200],l;/数组int n[200]储存长整形数

}X;/整数l表示该长整数的确实位数

加:这里考虑的是长整数+整数的情况。当然了两个长整数也是可以解决的。相对而言加是简单的,要考虑进位的事情,还有长整数长度的变化。

hh operator+(hh a,int y){/结构体和整数的加法

a.n[1]+=y;/将该整数加到长整数的第一位

int i=1;/从第一位开始

while(a.n[i]>0||i<=a.l){/或者某位数大于0,或i小于等于长整数的长度都要循环

a.n[i+1]+=a.n[i]/10;/将进位加到下一位

a.n[i]%=10;/原位置留下个位

i++;/准备算下一位

}/

a.l=i-1;/长整数的长度时i-1

return a;/返回该长整数

}/

乘:加是只加到第一位就行,而乘是要乘到每一位上。

hh operator *(hh a,int y){/

for(int i=1;i<=a.l;i++)a.n[i]*=y;/对每一位完成乘运算

for(int i=1;i<=a.l;i++){/

a.n[i+1]+=a.n[i]/10;/每一位大于10的部分加给下一位

if(i==a.l&&a.n[i+1])a.l++;/如果是最后一位,而且下一位有内容,长度就得增加

a.n[i]%=10;}/原位子留下个位数

if(y==0)a.l=1;/如果和0乘的话,长整数位数变成1

return a;/

}/

除:除得从最后一位算。如果数大于除数,就直接除,商是要得到的结果,余数乘10加到下一位;如果小,商就补零。

hh operator/(hh a,int y){/

int d=0,x;/

for(int i=a.l;i>=1;i--){/从最后一位遍历长整数

x=d*10+a.n[i];/除数是余数乘以10加上该位

if(x>=y){a.n[i]=x/y;d=x%y;x=0;}/如果被除数大于除数,该位留下商,余数要留着下次除时用。

else{d=x;a.n[i]=0;}/否则,该位留下零

}/

while(a.n[a.l]==0&&a.l>1)a.l--;/如果最后一位是零,就要一直缩减。很精妙

return a;/

}/

求余数:求余数跟找商基本是一样的,只是要返回的是余数。

期刊文章分类查询,尽在期刊图书馆

int operator %(hh a,int y){/

int d=0,x;/

for(int i=a.l;i>=1;i--){/也是从最后一位(也就是最左边的数字,高位)往前遍历

x=d*10+a.n[i];/被除数是余数*10+当前位数

if(x>=y){d=x%y;x=0;}/只有被除数大于除数,才可以除。当然这里只需要余数,此时被除数要变成0。

else {d=x;a.n[i]=0;}/否则余数变成被除数

}/

return d;/

}/

主程序:按照题意是要用逗号分开原进制,要转换进制的数和转换成的进制。这里用文本记住所有信息,再分割开。

main(){/

int m;cin>>m;/共几组数据

for(int z=0;z<m;z++){/

string s;cin>>s;/将所有信息输入到字符串里

int p=0,q=0,i;/P,q,记录原进制和变成的进制。i记住位置

for(i=0;s[i]!=’,’;i++)p=p*10+s[i]-’0’;/P原值乘10+下一位置的数字

长整数变成十进制数

当然内容是在逗号之间。

题意中说有0-9和A-Z,所以需要转换。这里isdigit(char)用的好。

X=X*p+x,简直就精妙了。这里当然是用上重载了,乘法和加法。关键是这个算法,结果乘以进制+当前数就得到了。

for(++i;s[i]!=’,’;i++){/

int x;/

if(isdigit(s[i]))x=s[i]-’0’;/如果是数字就s[i]-’0’

else x=s[i]-’A’+10;/否则就是s[i]-’A’+10

X=X*p+x;/转换成十进制

}/

如果十进制是0就直接输出0,不用算了

for(++i;s[i];i++)q=q*10+s[i]-’0’;/得到转换成的进制

if(X.l==1 && X.n[1] == 0)/如果确定是0

{ cout<<”0”<<endl; continue;}/就输出0。考虑下一个。

Continue有意思,是放弃此次运算,直接进入下次循环。

for(int i=0;i<10;i++){/

if(i==5)continue;/当等于5时,就直接下个循环

cout<<i<<endl;}/

转换成q进制数

string y;int j=0;/Y里放新数

while(X.l!=1||X.n[1]!=0){/只要被除数没变成0就要循环

char c;int x=X%q;/X是余数

if(x>=0&&x<10)c=x+’0’;/转换成字符放进c里

else c=x-10+’A’;/

y+=c;j++;/字符c再放进字符串y里

X=X/q;/X本身要被q整除,逐渐变小

}/

for(j=j-1;j>=0;j--)cout<<y[j];/从最后一位往前调

cout<<endl;/

}/

}/

论文作者:贺小龙

论文发表刊物:《教育学》2018年8月总第151期

论文发表时间:2018/8/22

标签:;  ;  ;  ;  ;  ;  ;  ;  

长整数的进制转换论文_贺小龙
下载Doc文档

猜你喜欢