閱讀以下說明和C程序,填充程序中的空缺,將解答填入答題紙的對應欄內(nèi)。
【說明】
正整數(shù)n若是其平方數(shù)的尾部,則稱n為同構(gòu)數(shù)。例如,6是其平方數(shù)36的尾部,76是其平方數(shù)5776的尾部,6與76都是同構(gòu)數(shù)。下面的程序求解不超過10000的所有同構(gòu)數(shù)。
己知一位的同構(gòu)數(shù)有三個: 1,5,6,到此二位同構(gòu)數(shù)的個位數(shù)字只可能是1,5,6這三個數(shù)字。依此類推,更高位數(shù)同構(gòu)數(shù)的個位數(shù)字也只可能是1,5,6 這三個數(shù)字。
下面程序的處理思路是:對不超過10000的每一個整數(shù)a,判斷其個位數(shù)字,若為1、5或6,則將a 轉(zhuǎn)換為字符串a(chǎn)s,然后對a進行平方運算,并截取其尾部與as長度相等的若干字符形成字符串后與as比較,根據(jù)它們相等與否來斷定a是否為同構(gòu)數(shù)。
【C 程序】
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int myitoa(int ,char *); /*將整數(shù)轉(zhuǎn)換為字符串*/
/* right取得指定字符串尾部長度為length的子串,返回所得子串的首字符指針*/
char *right(char*, int length);
int main ()
{
int a ,t; int len;
char as[10] ,rs[20];
printf("[1 ,10000]內(nèi)的同構(gòu)數(shù): \r");
for(a=1;a<=10000;a++) {
t = (1) ; /*取整數(shù)a的個位數(shù)字*/
if (t!=1&& t!=5 && t!=6) continue;
len = myitoa(a ,as); /*數(shù)a轉(zhuǎn)換為字符串,存入as */
myitoa(a*a, rs); /*數(shù)a的平方轉(zhuǎn)換為字符串,存入rs */
/*比較字符串a(chǎn)s與rs末尾長度為len的子串是否相等*/
if ( strcmp (as , (2) )==0 ) /*若相同則是同構(gòu)數(shù)并輸出*/
printf("%s的平方為%s\n" ,as,rs);
}
return 0;
}
int myitoa(int num ,char *s) /*將整數(shù)num轉(zhuǎn)換為字符串存入s */
{
int i ,n = 0;
char ch;
/*從個位數(shù)開始,取num的每一位數(shù)字轉(zhuǎn)換成字符后放入s[] */
while (num) {
s[n++] = (3) + '0' ;
num = num/10;
}
s[n]='\0';
for(i=0; i<n/2; i++) { /*將s中的字符串逆置*/
(4) ; s[i] = s[n-i-1]; S [n-i-1] = ch;
}
return n; /*返回輸入?yún)?shù)num的位數(shù)*/
}
char *right(char *ms ,int length)
/*取字符串ms尾部長度為length的子串,返回所得子串的首字符指針*/
{
int i;
for( ; *ms; ms++); /*使ms到達原字符串的尾部*/
for( i=0; i<length; (5) );/*使ms指向所得子串的首部字符*/
return ms;
}