2010 HIT计算机研究生机试真题

    xiaoxiao2021-03-26  10

    【分析】双重循环,分别枚举1~n每个数及每个数的因子(这里需要注意一个数的本身不是因子),并用sum记录因子之和。当因子之和=某个数自身时输出之,注意输出格式。

    #include <stdio.h> int main() { int i,j,n; int num,sum; while(scanf("%d",&n)!=EOF) { num=0; for(i=1;i<=n;i++) { sum=0; for(j=1;j<i;j++) { if(i%j==0) sum+=j; } if(i==sum) { num++; if(num==1) printf("%d",i); else printf(" %d",i); } } printf("\n"); } return 0; }

    源代码:

    #include <stdio.h> typedef long long ll; int main() {     ll a,n;     ll cnt,sum,temp;     while(scanf("%lld %lld",&a,&n)!=EOF)     {         cnt=sum=0;         temp=a;         while(cnt++<n)         {             sum+=temp;             temp=temp*10+a;         }         printf("%lld\n",sum);     }     return 0; }

    【分析】数据范围不大,可通过顺序查找完成。

    #include <stdio.h> #define maxn 210 int main() { int a[maxn]; int i,n,x,flag; while(scanf("%d",&n)!=EOF) //基本思想:顺序查找 { flag=0; for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&x); for(i=0;i<n;i++) { if(a[i]==x) { printf("%d\n",i); flag=1; break; } } if(flag==0) printf("-1\n"); } return 0; }

    【分析】“打擂台”算法,找序列最大值最小值问题。

    #include <stdio.h> #define maxn 25 int main() { int i,n,a[maxn]; int t,max,min,maxindex,minindex; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); if(n==1) printf("%d\n",a[0]); else { max=a[0],min=a[0]; maxindex=0,minindex=0; for(i=1;i<n;i++) { if(a[i]>max) { max=a[i]; maxindex=i; } if(a[i]<min) { min=a[i]; minindex=i; } } t=a[maxindex]; a[maxindex]=a[minindex]; a[minindex]=t; for(i=0;i<n-1;i++) printf("%d ",a[i]); printf("%d\n",a[n-1]); } } return 0; }

    【分析】串内排序,因为串不长,可以通过简单的冒泡、选择排序等方法实现。

    #include <stdio.h> #include <string.h> #define maxlen 210 void sort(char str[],int len) { int i,j; char t; for(i=0;i<len-1;i++) { for(j=0;j<len-1-i;j++) { if(str[j]>str[j+1]) { t=str[j]; str[j]=str[j+1]; str[j+1]=t; } } } } int main() { char str[maxlen]; int len; while(scanf("%s",str)!=EOF) { len=strlen(str); sort(str,len); printf("%s\n",str); } return 0; }

    ==================================我是分割线~=====================================

    拓展:输入一个长度不超过200且不含空格的字符串,按字符顺序升序排序,并统计字符的出现次数,每组输入结束后输出一空行 例:输入字符串edcbabcde     则输出:a:1                     b:2                     c:2                     d:2                     e:2

    #include <stdio.h> #include <string.h> #define maxlen 210 int Repeat(char str[],int i) //查找当前第i个字符是否与其前i-1个字符有重复 { int j,flag=0; for(j=0;j<i;j++) { if(str[j]==str[i]) { flag=1; break; } } return flag; } void Sort(char str[],int len) //字符串内排序 { int i,j; char t; for(i=0;i<len-1;i++) { for(j=0;j<len-1-i;j++) { if(str[j]>str[j+1]) { t=str[j]; str[j]=str[j+1]; str[j+1]=t; } } } } void Fun(char str[],int len) { int i,j,k=0; int time[maxlen]={0}; //记录字符的出现次数 char ch[maxlen]; //保存已出现的字符 for(i=0;i<len;i++) { if(Repeat(str,i)==0) //当前字符不与之前已出现的字符重复 { ch[k]=str[i]; //将该字符存入ch数组中,k记录出现的第k+1个不同字符 time[k]=1; //该字符出现次数置1 for(j=i+1;j<len;j++) //对该字符后面的字符遍历 { if(str[j]==str[i]) //发现与该字符相同的字符,该字符出现次数自增1 time[k]++; } k++; //k自增1,准备记录下一个之前未出现的字符 } } for(i=0;i<k;i++) //输出出现的字符及出现次数 printf("%c:%d\n",ch[i],time[i]); printf("\n"); } int main() { char str[maxlen]; int len; while(scanf("%s",str)!=EOF) { len=strlen(str); Sort(str,len); Fun(str,len); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-650142.html

    最新回复(0)