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; }程序截图:
新闻热点
疑难解答