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]);
    }
}
原文地址:https://www.cnblogs.com/Yogurshine/p/3824108.html