2
源代碼:
#include <stdio.h>#include <iostream>#include <algorithm>using namespace std;#define maxn 610int Judge(int a,int b) //最簡真分數判斷{ int p; while(b!=0) { p=a%b; a=b; b=p; } if(a>1) return 0; else return 1;}int main(){ int n,a[maxn]; int i,j; int count; while(scanf("%d",&n)!=EOF) { count=0; if(n==0) break; for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); //排序+輾轉相除法判斷分子與分母是否有最大公約數 for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(Judge(a[i],a[j])) count++; } } PRintf("%d/n",count); } return 0;}程序截圖:
※2. (2007年清華大學計算機研究生機試真題)質因數的個數題目描述:求正整數N(N>1)的質因數的個數。相同的質因數需要重復計算。如120=2*2*2*3*5,共有5個質因數。輸入:可能有多組測試數據,每組測試數據的輸入是一個正整數N,(1<N<10^9)。輸出:對于每組數據,輸出N的質因數的個數。樣例輸入:120樣例輸出:5提示:注意:1不是N的質因數;若N為質數,N是N的質因數。
源代碼:
#include <stdio.h>#include <math.h>int is_Prime(int n) //判斷一個數是否是質數(素數) { int i; int flag=1; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { flag=0; break; } } return flag;}int main(){ int N; int i,j,count; while(scanf("%d",&N)!=EOF) { j=sqrt(N); count=0; for(i=2;i<=j;i++) //判斷一個質數i是否是N的因數 { while(N%i==0 && is_Prime(i)) //注意相同的質因數需要重復計算,故放到while循環內 { count++; N/=i; } if(N==1) //while循環結束后N為1,直接跳出;否則找下一個質因數 break; } if(N!=1) //以上循環結束后N是質數,表示此時的N也是N的質因數 count++; printf("%d/n",count); } return 0;}程序截圖:
3. 回文子串題目描述:輸入一個字符串,輸出該字符串中對稱的子字符串的最大長度。比如輸入字符串“google”,由于該字符串里最長的對稱子字符串是“goog”,因此輸出4。輸入:存在多組數據,每組數據一行字符串,長度不大于100。輸出:輸出回文子串的最大長度。樣例輸入:google樣例輸出:4
源代碼:
#include <stdio.h>#include <string.h>#define maxlen 105int Judgestr(char str[],int len) //判斷字符串是否是回文串 { int i=0,j=len-1; int flag=1; while(i<j) { if(str[i]!=str[j]) { flag=0; break; } i++,j--; } return flag;}int main(){ char str[maxlen],obj[maxlen]; //兩數組分別保存源字符串與得到的回文子串 int i,j,k,t; int count,len,maxobjlen; while(gets(str)!=NULL) { len=strlen(str); count=2,maxobjlen=1; //初始狀態:從長度為2的子串開始找,回文子串長度為1 for(t=0;t<len;t++) //三重循環:第一重-完成"回溯",即找完長度為j的子串后可以繼續找長度為j+1的子串 { for(i=0;i<len;i++) //第二重-確定子串起點 { k=0; for(j=i;j<i+count;j++) //第三重-確定子串長度 obj[k++]=str[j]; obj[k]='/0'; if(Judgestr(obj,k)) //判斷子串為回文串時,得到回文子串長度 maxobjlen=count; //如果沒有符合上述要求的串,回文子串長度為1(一個字符也可以看做回文子串) } count++; } printf("%d/n",maxobjlen); }}程序截圖:
※4. (2002年華中科技大學計算機研究生機試真題)統計單詞題目描述:編一個程序,讀入用戶輸入的,以“.”結尾的一行文字,統計一共有多少個單詞,并分別輸出每個單詞含有多少個字符。(凡是以一個或多個空格隔開的部分就為一個單詞)輸入:輸入包括1行字符串,以“.”結束,字符串中包含多個單詞,單詞之間以一個或多個空格隔開。輸出:可能有多組測試數據,對于每組數據,輸出字符串中每個單詞包含的字母的個數。樣例輸入:hello how are you.樣例輸出:5 3 3 3
【分析】需要注意用scanf("%s",str); 或cin>>str; 輸入字符串,在沒有輸入任何字符的時候按空格、回車是不算字符的,如本題輸入( hello how are you.)結果是一樣的;在字符后面的空格為結束符,即變成(hello'/0' how'/0'are'/0'you.'/0'),只是這樣最后一個空格比較難解決,幸好有題中說以'.為結束符,這樣就有了界限,根據這個界限來換行,進行下一組輸入。
此外,也可將每個單詞包含的字母個數存入一數組,可以比較靈活地實現輸出。
源代碼:
#include <stdio.h>#define maxlen 1010int main() { char str[maxlen]; int i,len; while(scanf("%s",str)!=EOF) { len=0; for(i=0;str[i]!='/0' && str[i]!='.';i++) len++; if(str[i]=='.') printf("%d/n",len); else printf("%d ",len); } return 0;}程序截圖:
=====================================我是分割線=====================================
4. 拓展:輸入一句話,統計這句話中包含多少個單詞
源代碼:
#include <stdio.h>#include <string.h>#define maxlen 1010int main() { char str[maxlen]={'/0'}; int i,flag,count=0; while(gets(str)!=NULL) { flag=0,count=0; //flag開始置0可包括輸入的第一個字符非空格的情況,意味著已有一個單詞 for(i=0;i<strlen(str);i++) { if(str[i]==' ') //判斷當前字符是否是空格,若是,flag=0, flag=0; else //若不是,判斷當前字符前一個字符是否是空格,即flag是否等于0 { if(flag==0) //若前面是空格,則說明是新單詞的開始,并將flag置為1 { count++; flag=1; } } } printf("%d/n",count); } return 0; }程序截圖:
|
新聞熱點
疑難解答