• C常见机试题


    初级:

    一.请编写函数long fun(long int x),功能是:将长整型数x中每一位上为奇数的数依次取出,并逆序和顺序分别构成一个新数返回。
       例如:程序运行时输入123456789,输出:b=97531 和13579。

    #include <stdio.h>
    //逆序输出
    long fun(long int x)
    {
        int a;
        long b=0;
        while (x!=0)
        {
            a=x%10;
            if (a%2!=0)
            {
                b=b*10+a;
            }
            x=x/10;
        }
        return (b);
    }
    //顺序输出
    long fun2(long int x)
    {
        int a,m=1;
        long b=0;
        while (x!=0)
        {
            a=x%10;
            if (a%2!=0)
            {
                b=a*m+b;
                m*=10;
            }
            x=x/10;
        }
        return (b);
    }
    
    int main()
    {
        long int x;
        printf("Please input a long int num:");
        scanf("%ld",&x);
        long b=fun2(x);
        printf("b=%ld
    ",b);
    }
    View Code

    二 编写函数void fun(int *x,int n),它的功能是:求出数组x中的最小数和次最小数,并把最小数和a[0]中的数对调、次最小数和a[1]中的数对调,其余的数保持不变。

    如程序运行时若输入:2 4 6 11 3 9 7 0 5 8,则输出:0 2 6 11 3 9 7 4 5 8。

    #include <stdio.h>
    
    void fun(int *x,int n)
    {
        int i,j,k=0;
        for (i=0;i<2;i++)
        {
            int temp=x[i];
            for (j=i;j<n;j++)
            {
                if (x[i]>x[j])
                {
                    x[i]=x[j];
                    k=j;
                }
            }
            x[i]=x[k];
            x[k]=temp;
    
        }
    
    }
    
    int main()
    {
        int n;
        int x[50];
        printf("input size N :");
        scanf("%d",&n);
        for (int i=0;i<n;i++)
        {
            scanf("%d",&x[i]);
        }
        fun(x,n);
        for (i=0;i<n;i++)
        {
            printf("%d ",x[i]);
        }
    
        
    }
    View Code

    三. 编写函数long fun(int high,int n),功能是:计算并返回high以内(不包含high)最大的n个素数之和。若不足n个,则到最小素数2为止。

    例如:若high=100,n=10,则函数的返回值为:732;若high=11,n=10,则函数返回:17。
    分析:素数就是只有1这个约数。high以内的数,肯定最大的因数是q=sqrt(high);,判断从2-q没有一个数能整除的即是素数

    long fun(int high,int n)
    {
        int i,j,count=0,sum=0;
        int q=sqrt(high);
        for (i=high-1;i>=2;i--)
        {
            for (j=q;j>1;j--)
            {
                if (i%j==0 && i>j)//注意,&&后面的条件,负责会把素因子漏掉
                 break;
            }
            if (j<=1)
            {
                sum+=i;
                count++;
            }
            
            if (count==n)
             break;
    
        }
    
        return sum;
    
    }
    
    int main()
    {
        int high,n;
        scanf("%d %d",&high,&n);
        printf("%d
    ",fun(high,n));
    }
    View Code

     四 函数void fun(int x,char * p)实现十进制整数x到二进制的转换。转换后的二进制数以字符串的方式放置于p所指向的数组中。
      如输入13,输出1101,输入-13,输出-1101。

    分析:能被2整除二进制位为0,否则为1,中间借助额外数组保存临时数据。

    void fun(int x,char *p)
    {
        int i,k,j=0;
        int m=x;
        char s[50];
        while (x!=0)
        {
            if (x%2==0)
            {
                s[j]='0';
            }
            else
                s[j]='1';
            j++;
            x=x/2;
        }
        for (i=j-1, k=0;i>=0;i--,k++)
        {
            if (m<0)
            {
                p[0]='-';
                p[k+1]=s[i];
            }
            else 
            {
                p[k]=s[i];
            }
        }
        if (i==-1)
        {
            if (m<0)
            {
                p[k+1]='';
            }
            else
            p[k]='';
        }
    
             
    }
    int main()
    {
        int x;
        char p[50];
        scanf("%d",&x);
        fun(x,p);
        printf("%s
    ",p);
    
    }
    View Code

    五 .编写函数int fun(char (*ss)[N],int m,char *s),功能是:形参ss指向一个m行N列的二维字符数组,每行存放一个字符串。求出最大的字符串,复制到s所指的字符数组中,然后返回此最大字符串的长度。

    考察数组指针,以及字符串比较和拷贝

    #include <stdio.h>
    #include <string.h>
    #define N 50
    int fun(char (*ss)[N],int m,char *s)
    {
        int i;
        //char p[N];
        strcpy(s,*ss);
        for (i=1;i<m;i++)
        {
            if (strcmp(s,*(ss+i))<0)
            {
                strcpy(s,*(ss+i));
            }
        }
        int len=strlen(s);
        return len;
    }
    View Code

    六 给定程序中,函数void fun(char *s)的功能是:把形参s所指字符串中下标为偶数的字符右移到下一个偶数位置,最右边被移出字符串的字符绕回放到第一个偶数位置,下标为奇数的字符不动(注:字符串的长度大于等于2)。
      例:若输入:abcd123,输出:3badc21
      很巧妙的方法  ,每次都和第一位交换

    循环次数 一 a b c d 1 2 3
                二 c b a d 1 2 3

                三 1 b a d c 2 3

                四 3 b a d c 2 1

    void fun(char *s)
    {
        int i;
        char c;
        for (i=1;s[i]!='';i++)
        {
            if (i%2==0)
            {
                c=s[0];
                s[0]=s[i];
                s[i]=c;
            }
        }
    
    }
    View Code

    七 .函数void fun(char s[])的功能是:将s所指字符串中ASCII值为奇数的字符删除。
    例如,若s所指字符串中的内容为:“ABCDEFG12345”,其中字符A的ASCII码值为奇数、?、字符1的ASCII码值也为奇数、?都应当删除,其它依此类推。最后s中内容是:“BDF24”。
    方法一:借助临时数组

    void fun1(char *s)
    {
        int i,j;
        char p[50];
        for (j=0,i=0;s[i]!='';i++)
        {
            if ((int)s[i]%2==0)
            {
                p[j]=s[i];
                j++;
            }
        }
       p[j]='';
       strcpy(s,p);
    
    }
    View Code

    方法二:只用一个数组,每次把要删除的数后面的数往前移一位

    void fun2(char *s)
    {
        int i,j;
        for (i=0;s[i]!='';i++)
        {
            if (s[i]%2!=0)
            {
                for (j=i;s[j]!='';j++)
                {
                    s[j]=s[j+1];
                }
                i--;
            }
        }
    }
    View Code

    八 请编写一个函数int fun(long int x),它的功能是:判断整数x是否是同构数。若是同构数,函数返回1;否则返回0。所谓“同构数”是指这样的数,它出现在它的平方数的右边。
    例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数,输出"Yes"。要求x的值不大于10000。

    bool fun(long int x)
    {
        int i;
        int m=x*x;
        for (i=10;m%i!=0;i*=10)
        {
            if (m%i==x)
            return true;
        }
        return false;
    }
    View Code

    八 编写函数void fun(char *str),将参数字符串中各单词首字母变大写,其余字母变小写。输入输出在main中实现。

    如输入"you HAVE 10 books,don't you? " 输出"You Have 10 Books,Don't You?"。单词以空格、逗号、句号分隔。

    void fun(char *str)
    {
        int i,j;
        //先把首个单词首字母小写变大写
        if (str[0]>='a'&&str[0]<='z')
            str[0]-=32;
        
        //这段比较难理解
        for (i=0;str[i]!='';i++)
        {
            if (str[i]==' '||str[i]==','||str[i]=='.')
            {
                if (str[i+1]>='a'&&str[i+1]<='z')
                {
                    str[i+1]-=32;
                }
                   
                
            }
            else if (str[i+1]>='A'&&str[i+1]<='Z')
            {
                str[i+1]+=32;
            }    
        }
    }
    View Code

    九 n个整数,前面各数循环顺序后移m个位置,最后m个数变成最前面m个数。写函数void fun(int *p,int n,int m),实现上述功能。在main()中输入与输出。
      如下面程序输出 7 8 9 10 1 2 3 4 5 6 。注意,m可能大于n。

    //m是循环个数,n是数组长度
    void fun(int *p,int n,int m)
    {
        int i,j;
        m=m%n;
        for (j=0;j<m;j++)
        {
            int a=p[n-1];
            for (i=n-1;i>0;i--)
            {    
             p[i]=p[i-1];    
            }
            p[0]=a;
        }
    }
    View Code

    十 编写函数void fun(char *s1,char *s2),实现字符串s1与s2的交叉连接,连接后得到的新字符串放在s1中。
    如输入abc12345,输出a1b2c345,若输入abcde123,则输出a1b2c3de。
    方法一:借助临时数组

    void fun(char *s1,char *s2)
    {
        int i,j;
        int m=strlen(s1);
        int n=strlen(s2);
        char p [100];
        if (m>n)
        {
            for (j=0,i=0;i<n;i++,j++)
            {
               p[j]=s1[i];
               p[j+1]=s2[i];
               j++;
            }
            for (int k=m-n+1;k<m;k++,j++)
            {
              p[j]=s1[k];
            }
            p[j]='';
    
        }
        else if (m<n)
        {
            for (j=0,i=0;i<m;i++,j++)
            {
                p[j]=s1[i];
                p[j+1]=s2[i];
                j++;
            }
            for (int k=n-m+1;k<n;k++,j++)
            {
                p[j]=s2[k];
            }
            p[j]='';
            
        }
        else
        {
            for (j=0,i=0;i<m;i++,j++)
            {
                p[j]=s1[i];
                p[j+1]=s2[i];
                j++;
            }
             p[j]='';
        }
        strcpy(s1,p);
    }
    View Code

    方法二:不需要多余数组,方法不错

    void fun2(char *s1,char *s2)
    {
        int i,j,k;
        //int len=strlen(s1);
        for (j=0,i=1;s2[j]!='';)
        {
            for (k=strlen(s1);k>=i;k--)
            {
                s1[k+1]=s1[k];//每次把''也往后移动
            }
            
            s1[i]=s2[j];
            i++;
            j++;
            if (s1[i]) i++;        
        }
    }

    十一  传说可以根据两个人的生日来计算其缘分.方法:将两个人的生日各位相加,将得到的数再一次各位相加,直到其值为一个一位数,此数即代表两个人的缘分.
    例如,两个生日为:19820523,19841111,则各位相加:1+9+8+2+5+2+3+1+9+8+4+1+1+1+1得:56;再5+6得11;再 1+1得2,即为两人的缘分.编写计算缘分程序,两个生日由键盘输入

    分析:注意19820523,19841111各位数相加与x+y后各位相加的效果一样

    int fun(long x,long y)
    {
        int m,sum=0;
        for (m=x+y;m>0||sum>=10;)
        {
            sum+=m%10;
            m/=10;
            if (m==0&&sum>=10)
            {
                m=sum;
                sum=0;
            }
        }
        return sum;
    }

    十二 编写函数float fun(int m),功能是:根据正整型形参m,计算如下公式的值: y=1-1/2+1/3-1/4+1/5...+(-)1/m ,该值作为函数返回值.

    float fun(int m)
    {
        int i;
        float sum=0.0;
        for (i=1;i<=m;i++)
        {
            if (i%2!=0)
            {
                sum+=1.0/i;
            }
            else
                sum-=1.0/i;
        }
        return sum;
    }
    View Code


    进阶题:

    一 m个人围成一圈,1,2,3循环报数,报到3的人退出,并将退出的序号依次存到数组p中,包括最后一个人的序号。到最后只余1人,输出最后留下的是第几号(最初的序号,以1起始)及。
    若m=6,则输出n=1 3 6 4 2 5 1;若m=10,则输出n=4 3 6 9 2 7 8 5 10 4;若m=100,则输出n=91??。函数int fun(int n ,int *p)实现上述功能,返回n个人中最后余的1人的起始序号,并将退出的序号顺序写入p指向的数组中。

    #include <stdlib.h>
    //20 n,人个数,p数组保存退出序号
    int fun(int n,int *p)
    {
        int i,j=0,k=0,m=0;
        int *a=(int *)malloc(n*sizeof(int));
        //把原始数据存入数组a
        for (i=0;i<n;i++)
        {
            a[i]=i+1;
        }
        i=0;
        //退出一个人,a数组中相应位置变为0
        while(m<n)
        {   
            if (a[j]!=0)
            k++;
            if (k==3)//也不能是k%3==0,否则k=0也满足
            {
                p[i]=a[j];
                a[j]=0;
                i++;
                m++;
                k=0; //k从0计数到3,再清0.不能累加,否则当a[j]=0时,k虽然不自加,但仍然是3倍数时,会输出a[j]=0
            }
            j++;
            if (j==n)//a数组循环一遍从0再开始
            j=0;
        }
        free(a);
        return p[n-1];
    
    }
    
    int main()
    {
        int n=20;
        int p[200];
        int num=fun(n,p);
        printf("%d
    ",num);
        for (int i=0;i<n;i++)
        {
            printf("%d,",p[i]);
        }
    }
  • 相关阅读:
    js 特殊字符处理
    sql server 查询新增
    idea 很多基础文件找不到
    js 千分位
    Navicat Premium 12新增标识列
    Javascript 树形菜单 (11个)
    Javascript调用后台方法
    Treeview绑定数据库
    Repeater实现GridView编辑修改模式
    如何用JS获取键盘上任意按键的值?兼容FireFox和IE js获取键盘ASCII码?js键盘事件全面控制
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/3824108.html
Copyright © 2020-2023  润新知