




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
目錄CS21:特殊的四位數(shù)1CS22:確定進制3CS23:skew數(shù)5CS24:十進制到八進制7CS25:八進制到十進制8CS26:二進制轉(zhuǎn)化為十六進制8CS27:八進制小數(shù)(也屬于高精度計算)8CS28:二進制數(shù)13CS29:回文數(shù)(PalindromNumbers)14CS210:設(shè)計計算器(BasicallySpeaking)15CS211:18《算法與程序?qū)嵺`》習(xí)題解答2——數(shù)制轉(zhuǎn)換解決數(shù)制轉(zhuǎn)換問題時,如果所給的數(shù)值不是用十進制表示的,一般用一個字符型數(shù)組來存放。數(shù)組的每個元素分別存儲它的一位數(shù)字。然后按位轉(zhuǎn)換求和,得到十進制表示;再把十進制表示轉(zhuǎn)換成所求的數(shù)制表示。轉(zhuǎn)換的結(jié)果也用一個字符型數(shù)組表示,每個元素表示轉(zhuǎn)換結(jié)果的一位數(shù)字。根據(jù)數(shù)制表示中相鄰位的基數(shù)關(guān)系,可以把不同的數(shù)制分成兩類。一類數(shù)制表示中,相鄰位的基數(shù)是等比關(guān)系,例如我們熟悉的十進制表示。另一類數(shù)制表示中,相鄰位的基數(shù)是不等比的。例如在時間表示中,從秒到分采用60進進制;從月到年采用12進制。把一個數(shù)值從數(shù)制B的表示bmbm-1bm-2...b1轉(zhuǎn)換成十進制表示dndn-1dn-2...d1比較簡單。假設(shè)數(shù)制B中,第i位的基數(shù)為basei(1<=i<=m),直接把basei與bi相乘,然后對全部乘積求和。從十進制表示dndn-1dn-2...d1到bmbm-1bm-2...b1的轉(zhuǎn)換需要分兩種情況考慮:數(shù)制B中相鄰數(shù)字的基數(shù)是等比關(guān)系,即:basei(1<=i<=m)可以表示成Ci-1,其中C是一個常量。將dndn-1dn-2...d1除以C,余數(shù)即為b1;將dndn-1dn-2...d1和C相除的結(jié)果再除以C,余數(shù)即為b2;…;直至計算出為bm止。數(shù)制B中相鄰數(shù)字的基數(shù)不等比。需要先判斷dndn-1dn-2...d1在數(shù)制B中需要的位數(shù)m,然后從高位到低位依次計算bm、bm-1、bm-2、...、b1。10級 課堂講解:CS21CS22CS23 課堂練習(xí):CS24CS25課后作業(yè):CS26CS2809級 第一次課堂講解:CS21CS22CS23 實驗:CS24CS25 第二次課堂講解:CS26CS210 實驗:CS28CS29CS21:特殊的四位數(shù)(來源:POJ2196ZOJ2405程序設(shè)計方法及在線實踐指導(dǎo)(王衍等)例3.4,P140)問題描述:找出并輸出所有的4位數(shù)(十進制數(shù))中具有如下屬性的數(shù):四位數(shù)字之和等于其十六進制形式各位數(shù)字之和,也等于其十二進制形式各位數(shù)字之和。例如:十進制數(shù)2991,其四位數(shù)字之和2+9+9+1=21。由于2991=1*1728+8*144+9*12+3,其十二進制形式為1893(12),其各位數(shù)字之和也為21.但是它的十六進制形式為BAF(16),其各位數(shù)字之和等于11+10+15=36。因此你的程序要舍去2991這個數(shù)據(jù)。 下一個數(shù)2992,其十進制、十二進制、十六進制形式各位數(shù)字之和均為22,因此2992符合要求,應(yīng)該輸出來。(只考慮4位數(shù),2992是第一個符合要求的數(shù))輸入:本題沒有輸入。輸出:你的程序要求輸出2992及其他更大的、滿足要求的四位數(shù)(要求嚴格按升序輸出),每個數(shù)占一行(前后都沒有空行),整個輸出以換行符結(jié)尾。輸出中沒有空行。輸出中的前幾行如樣例輸出所示。樣例輸入:本題沒有輸入。樣例輸出:29922993299429952996299729982999...解題思路: 該題在求解時要用到枚舉的算法思想,即枚舉所有的四位數(shù)(1000-9999),判斷其是否滿足十六進制、十二進制和十進制形式的各位數(shù)之和相等。 這里要注意進制轉(zhuǎn)換方法。將一個十進制數(shù)Num轉(zhuǎn)換到M進制,其方法是:將Num除以M取余數(shù),直到商為0為止,存儲得到的余數(shù),先得到的余數(shù)為低位,后得到的余數(shù)為高位進行排序,余數(shù)0不能舍去。由于此題需要得到Num在16、12和10進制下各位的和,所以只要累加其余數(shù)即可。參考程序:#include<stdio.h>intmain(){ intNum,tmp; for(Num=1000;Num<=9999;Num++) { ints16=0,s12=0,s10=0; tmp=Num; while(tmp)//求其十六進制的和 { s16+=tmp%16; tmp/=16; } tmp=Num; while(tmp)//求十二進制的和 { s12+=tmp%12; tmp/=12; } if(s16!=s12)continue; tmp=Num; while(tmp) { s10+=tmp%10; tmp/=10; } if(s16==s10)printf("%d\n",Num); } return0;}CS22:確定進制(來源:2972,程序設(shè)計導(dǎo)引及在線實踐(李文新)例3.1P98)問題描述:6*9=42對于十進制來說是錯誤的,但是對于13進制來說是正確的。即,6(13)*9(13)=42(13),而42(13)=4*131+2*130=54(10)。你的任務(wù)是寫一段程序讀入三個整數(shù)p、q和r,然后確定一個進制B(2<=B<=16)使得p*q=r。如果B有很多選擇,輸出最小的一個。例如:p=11,q=11,r=121。則有11(3)*11(3)=121(3)因為11(3)=1*31+1*30=4(10)和121(3)=1*32+2*31+1*30=16(10)。對于進制10。有11(10)*11(10)=121(10)。這種情況下,應(yīng)該輸出3。如果沒有合適的進制,則輸出0。輸入:輸入有T組測試樣例。T在第一行給出。每一組測試樣例占一行,包含三個整數(shù)p、q、r。p、q、r的所有位都是數(shù)字,并且1<=p、q、r<=1,000,000。輸出:對于每個測試樣例輸出一行。該行包含一個整數(shù):即使得p*q=r成立的最小的B。如果沒有合適的B,則輸出0。樣例輸入:369421111121222樣例輸出:1330解題思路:此問題很簡單。選擇一個進制B,按照該進制將被乘數(shù)、乘數(shù)、乘積分別轉(zhuǎn)換成十進制。然后判斷等式是否成立。使得等式成立的最小B就是所求的結(jié)果。分別用一個字符型數(shù)組存儲p、q、r的各位數(shù)字符號。先以字符串的方式讀入p、q、r,然后按不同的進制將它們轉(zhuǎn)換成成十進制數(shù),判斷是否相等。參考程序:#include<stdio.h>#include<string.h>longb2ten(char*x,intb){ intret=0; intlen=strlen(x); inti; for(i=0;i<len;i++) { if(x[i]-'0'>=b)return-1; ret*=b; ret+=x[i]-'0'; } return(long)ret;}intmain(){ intn,b; charp[8],q[8],r[8]; longpb,qb,rb;//用來存儲轉(zhuǎn)換為十進制后的結(jié)果 scanf("%d",&n); while(n--) { scanf("%s%s%s",p,q,r); for(b=2;b<=16;b++) { pb=b2ten(p,b); qb=b2ten(q,b); rb=b2ten(r,b); if(pb==-1||qb==-1||rb==-1)continue; if(pb*qb==rb) { printf("%d\n",b); break; } } if(b==17)printf("0\n"); } return0;}注意事項:在數(shù)制b(2<=b<=16)的表示中,每一位上的數(shù)字一定都比b小。每讀入一組數(shù)據(jù)后,需要根據(jù)其中的數(shù)字,判斷b的下限。在參考程序的b2ten函數(shù)中,如果字符串x中存儲的數(shù)字比b大、或者與b相等,則返回-1,表明:按照數(shù)制b,x中存儲的表示形式是非法的,因此b不可能是所求的值。檢查:在未找到合適的b時,是否輸出0。CS23:skew數(shù)(來源:2973,程序設(shè)計導(dǎo)引及在線實踐(李文新)例3.2P101)問題描述:在skewbinary表示中,第k位的值xk表示xk*(2k+1-1)。每個位上的可能數(shù)字是0或1,最后面一個非零位可以是2,例如,10120(skew)=1*(25-1)+0*(24-1)+1*(23-1)+2*(22-1)+0*(21-1)=31+0+7+6+0=44.前十個skew數(shù)是0、1、2、10、11、12、20、100、101以及102。輸入:輸入包含一行或多行,每行包含一個整數(shù)n。如果n=0表示輸入結(jié)束,否則n是一個skew數(shù)。輸出:對于每一個輸入,輸出它的十進制表示。轉(zhuǎn)換成十進制后,n不超過231-1=2147483647。輸入樣例:1012020000000000000000000000000000010100000000000000000000000000000011100111110000011100001011011020000輸出樣例:44214748364632147483647471041110737解題思路1:skew數(shù)的相鄰位上,基數(shù)之間沒有等比關(guān)系。計算每一位的基數(shù)后,再把一個skew數(shù)轉(zhuǎn)換成十進制表示就很簡單。對于長度為k的skew數(shù),最后一位數(shù)字的基數(shù)為2k-1。由于轉(zhuǎn)換成十進制后,n不超過231-1,因此輸入skew數(shù)的最大長度不超過31。用一個整型數(shù)組base[31],依次存儲skew數(shù)最末位、倒數(shù)第2位、…..、第31位的基數(shù)值。使用這個數(shù)組,把每個skew數(shù)轉(zhuǎn)換成對應(yīng)的十進制數(shù)。base[0]=1base[k]=2k+1-1=2*(2k-1)+1=2*base[k-1]+1參考程序1:#include<stdio.h>#include<string.h>intmain(){ inti,k,base[31],sum; charskew[32]; base[0]=1; for(i=1;i<31;i++) base[i]=2*base[i-1]+1; while(1) { scanf("%s",skew); if(strcmp(skew,"0")==0) break; sum=0; k=strlen(skew); for(i=0;i<strlen(skew);i++) { k--; sum+=(skew[i]-'0')*base[k]; } printf("%d\n",sum); } return0;}解題分析2: 很明顯,對輸入文件中的skew二進制數(shù),不能采用整數(shù)形式(int)讀入,必須采用字符數(shù)組。那么需要定義多長的字符數(shù)組呢?題目中提到“輸入文件中的skew二進制數(shù)最大值對應(yīng)到十進制數(shù)為231-1=2147483647” 在把skew二進制數(shù)轉(zhuǎn)換成十進制時,只需把每位按權(quán)值展開求和即可。參考程序2:#include<stdio.h>#include<string.h>#include<math.h>intmain(){ charstr[40];//讀入的每個skew二進制數(shù) while(scanf("%s",str)!=EOF) { intlen=strlen(str); intnum=0;//對應(yīng)的十進制數(shù) if(len==1&&str[0]=='0')break; intweight=2;//每位的權(quán)值為weight-1 inti; for(i=len-1;i>=0;i--) { num+=(str[i]-'0')*(weight-1); weight*=2; } printf("%d\n",num); } return0;}CS24:十進制到八進制(來源:2734,程序設(shè)計導(dǎo)引及在線實踐(李文新)練習(xí)1P102)問題描述:把一個十進制正整數(shù)轉(zhuǎn)化成八進制輸入:一行,僅含一個十進制表示的整數(shù)a(0<a<65536)輸出:一行,a的八進制表示樣例輸入:9樣例輸出:11CS25:八進制到十進制(來源:2735,程序設(shè)計導(dǎo)引及在線實踐(李文新)練習(xí)2P103)問題描述:把一個八進制正整數(shù)轉(zhuǎn)化成十進制輸入:一行,僅含一個八進制表示的正整數(shù)a,a的十進制表示的范圍是(0,65536)輸出:一行,a的十進制表示樣例輸入:11樣例輸出:9CS26:二進制轉(zhuǎn)化為十六進制(來源:2798,程序設(shè)計導(dǎo)引及在線實踐(李文新)練習(xí)3P103)問題描述:輸入一個2進制的數(shù),要求輸出該2進制數(shù)的16進制表示。在16進制的表示中,A-F表示10-15輸入:第1行是測試數(shù)據(jù)的組數(shù)n,后面跟著n行輸入。每組測試數(shù)據(jù)占1行,包括一個以0和1組成的字符串,字符串長度至少是1,至多是10000輸出:n行,每行輸出對應(yīng)一個輸入。樣例輸入:2100000111樣例輸出:207解題思路 二進制轉(zhuǎn)換為十六進制從低位開始,每4位轉(zhuǎn)換為一位十六進制。最前面剩余的不足4位的補0補到4位,再轉(zhuǎn)換。CS27:八進制小數(shù)(也屬于高精度計算)(來源:2765,程序設(shè)計導(dǎo)引及在線實踐(李文新)練習(xí)4P103)問題描述:八進制小數(shù)可以用十進制小數(shù)精確的表示。比如,八進制里面的0.75等于十進制里面的0.963125(7/8+5/64)。所有小數(shù)點后位數(shù)為n的八進制小數(shù)都可以表示成小數(shù)點后位數(shù)不多于3n的十進制小數(shù)。你的任務(wù)是寫一個程序,把(0,1)中的八進制小數(shù)轉(zhuǎn)化成十進制小數(shù)。輸入:輸入包括若干八進制小數(shù),每個小數(shù)占用一行。每個小數(shù)的形式是0.d1d2d3...dk,這里di是八進制數(shù)0...7,而且已知0<k<15。輸出:對于每個輸入的八進制小數(shù),輸入如下形式的一行0.d1d2d3...dk[8]=0.D1D2D3...Dm[10]這里左邊是輸入的八進制小數(shù),右邊是相等的十進制小數(shù)。輸出的小數(shù)末尾不能有0,也就是說Dm不等于0。樣例輸入:0.750.00010.01234567樣例輸出:0.75[8]=0.953125[10]0.0001[8]=0.000244140625[10]0.01234567[8]=0.020408093929290771484375[10]提示:如果你使用字符串讀取八進制小數(shù),你可以使用如下的形式中止輸入charoctal[100];while(cin>>octal){...}d1d2d3...dk[8]=(d1+(d2+(d3+(...dk*0.125...)*0.125)*0.125)*0.125[10]=(d1*103*(k-1)+(d2*103*(k-2)+(d3*103*(k-3)+(...dk*125...)*125)*125)*125*10-3*k[10]D1D2D3...Dm中小數(shù)點后最多可以有42位數(shù)字。用一個數(shù)組來存儲D1D2D3...Dm,每個元素存儲一位數(shù)字。參考程序1:(網(wǎng)上直接粘貼來的)#include<stdio.h>#include<string.h>intset[15][50],output[50],op[50];voidinit(){ inti,j,sum=0; memset(set,0,15*50*sizeof(int)); set[0][2]=1; for(i=1;i<15;i++) { sum=0; for(j=2;j<50;j++) { sum*=10; sum+=set[i-1][j]; if(sum>=8) { set[i][j]=sum/8; sum%=8; } } }}voidadd(int*output,int*op){ inti; for(i=49;i>=0;i--) { output[i]+=op[i]; if(output[i]>=10) { output[i]-=10; output[i-1]++; } }}voidmulti(intn,intm){ inti; memset(op,0,50*sizeof(int)); for(i=0;i<n;i++) add(op,set[m]);}intmain(){ init(); inti,len,flag; charinput[20]; while(scanf("%s",input)!=EOF) { memset(output,0,50*sizeof(int)); len=strlen(input); for(i=2;i<len;i++) { multi((input[i]-'0'),i-1); add(output,op); } for(i=49;i>=0;i--) if(output[i]) break; flag=i; printf("%s[8]=0.",input); for(i=3;i<=flag;i++) printf("%d",output[i]); printf("[10]\n"); } return0;}參考程序2(壽浙威):#include<stdio.h>#include<string.h>#definemaxn100;intmain(){inti;charstr[20],res[60];while(scanf("%s",str)!=EOF){doubleexp=1;doublesum=0.0;for(i=2;str[i];i++){exp*=8;sum+=(str[i]-48)/exp;}intlen=strlen(str)-2;inttmp;exp=10;//printf("%lf\n",sum);printf("%s[8]=0.",str);for(i=0;i<len*3;i++){sum*=exp;tmp=(int)sum;sum-=tmp;res[i]=tmp+'0';//printf("%c",res[i]);}//printf("\n");intk=len*3;while(!(res[i]-'0'))k--;for(i=0;i<k;i++)printf("%c",res[i]);printf("[10]\n");}return0;}解題分析2: 八進制小數(shù)轉(zhuǎn)換成十進制小數(shù),其原理本來是按權(quán)值展開,小數(shù)點后第1位的權(quán)值為8-1=0.125,第2位的權(quán)值為8-2=0.015625.因此0.75[8]=7*0.125+5*0.015625=0.953125。但在本題中,如果按照這種思路去求解,不容易實現(xiàn)。 更好的方法是轉(zhuǎn)換成除法運算,小數(shù)點后第1位的權(quán)值為8-1,相當于除以8;第2位的權(quán)值為8-2,相當于除以兩次8,……。具體過程為:循環(huán)除以8,即從八進制小數(shù)的最后一位開始除以8,把得到的結(jié)果加到前一位,在除以8,……。一直到小數(shù)點后第1位為止。假設(shè)讀入的八進制為0.d1d2d3…dn,轉(zhuǎn)換后的十進制為0.D1D2D3…Dm,則循環(huán)除以8的公式為: 0.D1D2D3…Dm=(d1+(d2+(d3+…(dn-1+dn/8)/8…)/8)/8)/8 例如,對八進制小數(shù)0.123[8]=(1+(2+3/8)/8)/8.具體過程為:注意得到的十進制小數(shù)都不保留前面的0及小數(shù)點。 (1)先讀入最后一位num=3,按照除法運算規(guī)則進行除8運算,不足的就補0,相當于乘以10,直到余數(shù)為0。這樣得到結(jié)果為375,實際上表示的是0.375,即0.3[8]對應(yīng)的十進制小數(shù)。 (2)接下來讀入前一位num=2,這時要求的是2.375/8,轉(zhuǎn)換成求2375/8,得到的結(jié)果為296875,實際上是0.296875,即0.23[8]對應(yīng)的十進制小數(shù)。 反復(fù)進行下去,直到求完所有的位數(shù)。參考程序3:#include<stdio.h>#include<string.h>constintMAX_LENGTH=20;intmain(){ charsrc[MAX_LENGTH];//讀入來的八進制小數(shù)(字符形式) inti,j;//freopen("in.txt","r",stdin); while(scanf("%s",src)!=EOF) { chardest[MAX_LENGTH*4]={'0'};//存放轉(zhuǎn)化后的十進制數(shù)(無0.) intnum;//讀取處理的每個八進制位(整數(shù)形式) intindex=0;//前一個八進制位除以8后dest數(shù)組中的位數(shù) intlen=0;//當前這個八進制位除以8后dest數(shù)組中的位數(shù) inttemp;//當前這個八進制位與前一位運算結(jié)果的每一位組合得到的值 for(i=strlen(src)-1;i>1;i--)//刨掉最前面的0和小數(shù)點. { num=src[i]-'0';//取第i位上的八進制數(shù)字 for(j=0;j<index;j++)//d1~dn-1的處理 { temp=num*10+dest[j]-'0'; dest[j]=temp/8+'0'; num=temp%8; } while(num)//d1~dn的處理(余數(shù)的處理,補0再除直到商為0為止) { num*=10; dest[len++]=num/8+'0'; num%=8; } index=len; } dest[len]='\0'; printf("%s[8]=0.%s[10]\n",src,dest); } return0;}CS28:二進制數(shù)(來源:ZOJ1383,程序設(shè)計方法及在線實踐指導(dǎo)(王衍等)練習(xí)3.1P142)問題描述:給定一個正整數(shù)n,要求輸出對應(yīng)的二進制數(shù)中所有數(shù)碼“1”的位置。注意最低位為第0位。例如13的二進制形式為1101,因此數(shù)碼1的位置為:0,2,3.輸入:輸入文件中的第1行為一個正整數(shù)d,表示輸入文件中測試數(shù)據(jù)的個數(shù),1<=d<=10,接下來有d個測試數(shù)據(jù)。每個測試數(shù)據(jù)占一行,只有一個整數(shù)n,1<=n<=106。輸出:輸出包括d行,即對輸入文件中的每個測試數(shù)據(jù),輸出一行。第i行,1<=i<=d,以升序的順序輸出第i個測試數(shù)據(jù)中的整數(shù)的二進制形式中所有數(shù)碼1的位置,位置之間有1個空格,最后一個位置后面沒有空格。樣例輸入:213127樣例輸出:0230123456提示:對輸入的整數(shù)n,依次用2去整除,用變量pos充當計數(shù)器(代表二進制的位),如果得到的余數(shù)為1,則輸出pos,否則不輸出;pos的初值為0,每次將n除以2后,pos自增1.題目要求兩個位置之間有1個空格,最后一個位置之后沒有空格,解決方法是在第1個位置之前不輸出空格,然后再接下來的所有數(shù)碼“1”的位置之前輸出1個空格。CS29:回文數(shù)(PalindromNumbers)(來源:ZOJ1078,程序設(shè)計方法及在線實踐指導(dǎo)(王衍等)例7.1P234)問題描述:我們稱一個數(shù)是一個回文數(shù),當且僅當它從左往右讀和從右往左讀起來都是一樣的。比如75457就是回文數(shù)。 當然,這種性質(zhì)取決于這個數(shù)是在什么進制下,比如17在十進制下不是一個回文數(shù),但在二進制下則是一個回文數(shù)(10001)。 這道題的目的是驗證給定的一組數(shù)分別在2進制~16進制下是否是回文數(shù)。輸入:輸入文件包含了若干個整數(shù),每個整數(shù)n都是在十進制下給出的,每個整數(shù)占一行,0<n<50000。輸入文件以0表示結(jié)束。輸出:當該整數(shù)在某些進制下是回文數(shù),則輸出“Numberiispalindrominbasis”,分別列出這些基數(shù),其中i是給定的整數(shù)。如果該整數(shù)在2~16進制下都不是回文數(shù),則輸出“Numberiisnotpalindrom”。樣例輸入:17190樣例輸出:Number17ispalindrominbasis2416Number19isnotapalindrom解題分析: 對讀入的每個十進制數(shù)number,依次判讀number在2~16進制下是否為回文數(shù)并輸出如果都不是則輸出“Numberiisnotpalindrom”。 在判讀十進制數(shù)number在basis進制下是否為回文數(shù)時,首先要將十進制數(shù)number轉(zhuǎn)換為basis進制,即將number除以basis取余數(shù)。存儲余數(shù)時要注意以下兩個問題: (1)十進制以上的進制中的數(shù)碼除了0~9外,還有字母,例如十六進制的數(shù)碼為0~9,以及A、B、C、D、E、F。那么是否需要將得到的余數(shù)以字符形式存放呢? (2)進制轉(zhuǎn)換時,得到的余數(shù)排列順序是:先得到的余數(shù)位于低位,后得到的余數(shù)位于高位,是否有必要嚴格按照這個順序(即與余數(shù)產(chǎn)生順序相反的順序)存儲得到的余數(shù)? 對于第一個問題,答案是不需要,更方便的做法是在取余數(shù)時把得到的余數(shù)以整數(shù)形式存放到一個整型數(shù)組里。例如,十進制的2847,在15進制下得到的余數(shù)為12,9和12.其中第1個和第3個余數(shù)在15進制下為字符C,但我們并不需要得到真正的15進制數(shù),只需要判斷各位數(shù)碼中的某些位是否相等。 對于第二個問題,答案也是不需要的。因為如果一個數(shù)是回文數(shù),則各位逆序后仍然是回文數(shù),因此在取余時可以按先后順序存放到整型數(shù)組里,然后判斷數(shù)組中的數(shù)是否構(gòu)成回文數(shù)。CS210:設(shè)計計算器(BasicallySpeaking)(來源:POJ1546ZOJ1334,程序設(shè)計方法及在線實踐指導(dǎo)(王衍等)練習(xí)7.1P241)問題描述:某個公司最近邀請你設(shè)計一個計算器。作為計算機科學(xué)家,你建議將這個計算器設(shè)計得靈巧一點,使得它能在各種進制之間進行轉(zhuǎn)換。公司認為這是一個很好的想法,并要求你拿出實現(xiàn)進制轉(zhuǎn)換的算法原型。公司經(jīng)理告訴你,該計算器有以下特征: (1)它的顯示器有7位; (2)它的按鍵除了數(shù)字0到9外,還有大寫字母A到F; (3)它支持2~16進制。輸入:輸入文件中的每一行要實現(xiàn)一次進制轉(zhuǎn)換。每一行有3個數(shù),第1個數(shù)是A進制下的一個整數(shù),第2個數(shù)就是A,第3個數(shù)是B,要實現(xiàn)的是將第1個數(shù)從A進制轉(zhuǎn)換到B進制下。這3個數(shù)的兩邊可能有一個或多個空格。輸入數(shù)據(jù)一直到文件結(jié)尾。輸出:實現(xiàn)輸入文件中的每次進制轉(zhuǎn)換,轉(zhuǎn)換后的數(shù)右對齊到7位顯示器。如果轉(zhuǎn)換后的數(shù)的位數(shù)太多,在7位顯示器中顯示不下,則輸出“ERROR”,也是右對齊到7位顯示器。樣例輸入:111100021011110002162102101310210210131512312421A15212345671016ABCD1615樣例輸出:1207817657CAERROR1100112D687D071參考程序(zzg):#include<stdio.h>#include<string.h>longb2ten(char*x,intb);intmain(){ charnumsrc[10],numdest[10];//用來存儲讀入的數(shù)和轉(zhuǎn)換后的數(shù) chartemp[10]; charerror[10]="ERROR"; longnum; intsrc,dest;//轉(zhuǎn)換前的進制和轉(zhuǎn)換后的進制 inti,j; //freopen("in.txt","r",stdin); while(scanf("%s%d%d",numsrc,&src,&dest)!=EOF) { //先把src進制的數(shù)轉(zhuǎn)換為10進制數(shù),存放到temp中 num=b2ten(numsrc,src); if(dest==10) { if(num>9999999) printf("%7s\n",error); else printf("%7d\n",num); } else { i=0; while(num) { if(num%dest<10) numdest[i++]=num%dest+'0'; else { switch(num%dest) { case10: numdest[i++]='A'; break; case11: numdest[i++]='B'; break; case12: numdest[i++]='C'; break; case13: numdest[i++]='D'; break; case14: numdest[i++]='E'; break; case15: numdest[i++]='F'; break; } } num/=dest; } numdest[i]='\0'; if(strlen(numdest)>7) printf("%7s\n",error); else//逆序輸出 { j=0; for(i=strlen(numdest)-1;i>=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國土雞行業(yè)深度研究分析報告
- 2025年機動噴粉機項目可行性研究報告
- 2024-2025學(xué)年高中政治第四單元發(fā)展社會主義市抄濟第十課科學(xué)發(fā)展觀和械社會的經(jīng)濟建設(shè)課時1中國經(jīng)濟發(fā)展進入新時代課時精練含解析新人教版必修1
- 2024-2025學(xué)年高中語文第二單元義薄云天自讀文本管鮑之交鞏固提升案魯人版選修史記蚜
- 2024-2025學(xué)年高中地理第四章生態(tài)環(huán)境保護第五節(jié)中國區(qū)域生態(tài)環(huán)境問題及其防治途徑課時作業(yè)新人教版選修6
- 中國男式帆布鞋行業(yè)市場調(diào)研分析及投資前景預(yù)測報告
- 2025年電扇金屬配件行業(yè)深度研究分析報告
- 2024中國機械設(shè)備租賃市場前景及投資研究報告
- 2024黑色金屬礦采選業(yè)行業(yè)分析報告
- 2025年中國監(jiān)護儀行業(yè)市場運營現(xiàn)狀及投資戰(zhàn)略咨詢報告
- 文化產(chǎn)業(yè)管理專業(yè)大學(xué)生職業(yè)生涯規(guī)劃書
- DSM-V美國精神疾病診斷標準
- 文獻的載體課件
- 2023年高考語文全國乙卷《長出一地的好蕎麥》解析
- 混凝土強度回彈檢測方案
- 歷年中考地理生物變態(tài)難題
- 研學(xué)旅行課程標準(一)-前言、課程性質(zhì)與定位、課程基本理念、課程目標
- 部編版二年級下冊語文教案全冊
- 解放牌汽車CA10B后鋼板彈簧吊耳加工工藝及夾具設(shè)計哈
- 大學(xué)??啤稒C電傳動控制》課件
- 高中地理高清區(qū)域地理填圖冊
評論
0/150
提交評論