2011藍橋杯【初賽試題】中獎計算
中獎計算
某抽獎活動的規則是:每位參與者在紙上寫下一個8位數的號碼。最後通過搖獎的辦法隨機產生一個8位數字。參與者寫下的數字中最多有多少個連續位與開獎號碼中的相同,則稱為中了幾個號。
例如:小張寫的數字是:12345678,而開獎號碼是:42347856。則稱小張中了3個號,因為其中最長的相同連續位是:“234”。如果小張寫的是:87654321,則他隻中了一個號。
下麵的代碼根據傳入的參數,返回中了幾個號。其中:a表示被評價的號碼,b表示搖號產生的數字。請填寫缺少的代碼。
int g(int a, int b)
{
char sa[]="00000000";
char sb[]="00000000";
int n = 0;
int i,j;
sprintf(sa,"%8d",a);
sprintf(sb,"%8d",b);
for(i=0; i<8; i++)
{
for(j=1; j<=8-i; j++)
{
char t = ________;
sa[i+j] = 0;
if(strstr(sb, sa+i))
{
if(j>n) _________;
}
sa[i+j] = t;
}
}
return n;
}
首先要了解這兩個函數:sprintf與strstr
1>sprintf
sprintf
字串格式化命令,主要功能是把格式化的數據寫入某個字符串中。sprintf 是個變參函數。
功能
把格式化的數據寫入某個字符串緩衝區。
頭文件
stdio.h
原型
int sprintf( char *buffer, const char *format, [ argument] … );
參數列表
buffer:char型指針,指向將要寫入的字符串的緩衝區。
format:格式化字符串。
[argument]...:可選參數,可以是任何類型的數據。
返回值:字符串長度(strlen)
/*例子*/
#include <stdio.h>//某個頭文件
int main ()/*主函數“整數”類型*/
{
char buffer [50];/*“字符”類型的數組,下麵共有50個元素。*/
int n, a=5, b=3;/*三個變量都為“整數”類型*/
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);/*賦予數值*/
printf ("[%s] is a string %d chars long\n",buffer,n);/*“格式輸出”*/
return 0;/*“返回 零”
也就是程序正常退出*/
}
輸出結果:
[5 plus 3 is 8] is a string 13 chars long
2>strstr
包含文件:string.h
函數名: strstr
函數原型:extern char *strstr(char *str1, char *str2);
功能:從字符串str1中查找是否有字符串str2,如果有,從str1中的str2位置起,返回str1中str2起始位置的指針,如果沒有,返回null。
返回值:返回該位置的指針,如找不到,返回空指針。
例子:
char str[]="1234 xyz";
char* str1=strstr(str,"34");
cout<<str1<<endl;
顯示: 34 xyz
int g(int a, int b) { char sa[]="00000000"; char sb[]="00000000"; int n = 0; int i,j; sprintf(sa,"%8d",a); sprintf(sb,"%8d",b); for(i=0; i<8; i++) { for(j=1; j<=8-i; j++) { char t = sa[i+j];//為了設置結束標簽之後好還原sa[i+j] sa[i+j] = 0;//設置結束標簽(我認為應該是'\0') if(strstr(sb, sa+i))//從i一直對比到i+j { if(j>n) n=j;//如果出現比上一次記錄的最長連續相等序列還長,就替換掉它 } sa[i+j] = t;//把sa[i+j]還原回來 } } return n; }
最後更新:2017-04-03 12:55:32