美文网首页
巧妇难为无米之炊-算法

巧妇难为无米之炊-算法

作者: 视野跳动 | 来源:发表于2018-05-09 19:37 被阅读0次

    试卷一

    1.统计 100 到 1000之间有多少个数其各位数字之和是 5。

    int main()
    {
        int i,count=0,a,b,c;
        for(i=100;i<=1000;i++){
            a = i/100;//百位数
            b = i/10%10;//十位数
            c = i%10;//个位数
            if(a+b+c==5)
                count++;
    
        }
        printf("共有:%d\n",count);
        return 0;
    }
    
    

    2.输出某数列的前20项,该数列第1,2项分别是 0 和 1,以后每个奇数编号的项是前两项之和,每个偶数编号的项是前两项之差。生成的 20 个数存入一维数组中,并按每行 4 个数输出。

    int main()
    {
        int i,arr[20];
        arr[0] = 0;
        arr[1] = 1;
        for(i=2;i<20;i++){
            if((i+1)%2==0){//计算偶数项
                arr[i] = arr[i-1]-arr[i-2];
            }else{
                arr[i] = arr[i-1]+arr[i-2];
            }
        }
        for(i=0;i<20;i++){
            if(i%4==0){
                printf("\n");
            }
            printf("%3d",arr[i]);
        }
        return 0;
    }
    
    

    3.编写一个函数 fun ,它的功能是:根据以下公式求 p 的值,结果由函数值带回。m与n为两个正整数,且要求 m>n。p=m!/(n!*(m-n)!)。

    float fun13(int m,int n){
        float p=0;
        long s1=1,s2=1,s3=1;//使用long型存储阶乘数,防止数据过大,内存溢出。
        int i,j;
        if(m>n){
            for(i=1;i<=m;i++){
                s1 *= i;
            }
            for(i=1;i<=n;i++){
                s2 *= i;
            }
            for(i=1;i<=(m-n);i++){
                s2 *= i;
            }
            p = 1.0*s1/s2/s3;
            return p;
        }else{
            printf("m必须大于n!");
            return -1;
        }
    
    }
    
    /*int main(){
        printf("%f",fun13(20,15));
        return 0;
    }*/
    

    试卷二

    1.编程实现:输出 0、1、2、3 组成的所有的各位数字均不相同的三位数,输出时每 6 个数占一行。

    int main()
    {
        int i,j,k,n=0;
        for(i=1;i<=3;i++){
            for(j=0;j<=3;j++){
                for(k=0;k<=3;k++){
                    if((i!=j)&&(i!=k)&&(j!=k)){
                        printf("%4d",i*100+j*10+k);
                        n++;
                        if(n%6==0){
                            printf("\n");
                        }
                    }
                }
            }
        }
        return 0;
    }
    
    

    2.一球从 100 米高度自由落下,每次落地后反弹回原高度的一半;再落下,求它在第10次落地时,共经历过多少米?第10次反弹多高?

    //自己写的,很好理解,运行结果是299.707031 0.097656
    int main()
    {
        double sum=0,h=100;
        int i;
        for(i=1;i<=10;i++){
            sum = sum + h + h/2;
            h = h/2;
        }
        printf("总路程:%lf:\n",sum);
        printf("第十次的高度:%lf",h);
        return 0;
    }
    
    //谭浩强教授写的,运行的结果是 299.609375 0.097656
    /**
    谭教授的算法是将“触地后到下一次触地”,作为一次循环,自己的算法误差较大了。
    */
    int main()
    {
        float sum = 100,h=50;
        int i;
        for(i=2;i<=10;i++){
            sum = sum + 2*h;
            h = h/2;
        }
        printf("总路程:%lf:\n",sum);
        printf("第十次的高度:%lf",h);
        return 0;
    }
    
    

    3.若输入的字符串中只包含字母和*号。请编写函数fun,功能是将字符串中的前导*号全部移到字符串的尾部。

    /**
    什么是前导 * ?例如*******A*BC*DEF*G****,我们要做的就是把A之前的*,全部移动到字符串的尾部。
    1、定义一个字符串数组
    2、定义一个fun函数,形参是字符数组
    3、在fun函数中
    ①首先我们要知道有多少个前导 * 。
    ②开始位移,将字母向前移,后面补充 * 。
    */
    void fun6(char str[]){
        int count=0,i,j;
        char temp;
        int str_length = strlen(str);
        // printf("%d",str_length);
        for(i=0;i<str_length;i++){
            if(str[i]=='*'){
    
            }else{
                if(i==0){
                    printf("没有前导*");
                    return;
                }
                break;
            }
        }
        //开始移动
        int k,m;
        for(j=i-1,k=0;j>=0;j--,k++){
            temp = str[j];
            for(m=j+1;m<str_length-k;m++){
                str[m-1]=str[m];
            }
            str[str_length-1-k] = temp;
        }
    
        puts(str);
    }
    
    int main()
    {
        char str[50];
        gets(str);
        fun6(str);
        return 0;
    }
    

    试卷三

    1.输出以下图形(整个图形向中央平移5列)

    /*
            *
            ***
            *****
            *******
            *****
            ***
            *
    */
    int main()
    {
        int i,j,k,n=4;
        //输出上三角
        for(i=1;i<=n;i++){
            for(k=0;k<5;k++){
                printf(" ");
            }
            for(j=1;j<=2*i-1;j++){
                printf("*");
            }
            printf("\n");
        }
        //输出下三角
        for(i = 1;i<=n-1;i++){
            for(k=0;k<5;k++){
                printf(" ");
            }
            for(j=1; j<=2*(n-i)-1; j++){
                printf("*");
            }
            printf("\n");
        }
        return 0;
    }
    

    2.从键盘输入一整数,用折半查找法找出该数在10个有序整型数组a中的位置,若该数不存在,则输出相应的信息。

    int main()
    {
        int arr[] = {1,2,3,4,5,6,7,8,9,10};
        int value;
        scanf("%d",&value);
        int n = 10;
        int min=0,max,mid;
        max = n - 1;
        mid = (min+max)/2;
        while(arr[mid]!=value){
            if(arr[mid]>value){
                max = mid - 1;
            }else if(arr[mid]<value){
                min = mid +1;
            }
    
            mid = (min+max)/2;
    
            if(mid>max||mid<min){
                printf("this value not found!");
                return -1;
            }
        }//while循环结束
        printf("对应的数组下标是:%d\n",mid);
        return 0;
    }
    

    3.学生的信息由学号和成绩组成,10名学生的数据已在主函数中放入结构体数组s中,编写一函数,功能是把低于平均分的学生数据放在另一个数组中,低于平均分的学生人数通过形参 n 传回,平均分通过函数值返回。

    struct student{
            int id;
            double score;
        }s[5],b[5];
    
        int num;
    
     double fun(int *n){
        double avg = 0.0;
        int i,count = 0;
        for(i = 0;i<num;i++){
            avg += s[i].score;
        }
    
        avg = avg/num;
    
        for(i = 0;i<num;i++){
            if(s[i].score>=avg){
                b[count].id = s[i].id;
                b[count++].score = s[i].score;
            }
        }
        *n = count;
        return avg;
     }
    int main()
    {
        int i,n=0;
        printf("请输入学生人数:\n");
        scanf("%d",&num);
        for(i = 0;i<num;i++){
            printf("请输入第%d个学生的学号:",i+1);
            scanf("%d",&s[i].id);
            printf("请输入第%d个学生的成绩:",i+1);
            scanf("%lf",&s[i].score);
        }
        double avg = fun(&n);
        for(i = 0;i<n;i++){//.2lf:保留两位有效小数
            printf("%d %.2lf\n",b[i].id,b[i].score);
        }
        printf("%.2lf",avg);
        return 0;
    }
    

    试卷四

    1.给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

    //最笨的写法!!!
    int main()
    {
        long a,b,c,d,e,x;
        printf("请输入 5 位数字:");
        scanf("%ld",&x);
        a=x/10000;        /*分解出万位*/
        b=x%10000/1000;   /*分解出千位*/
        c=x%1000/100;     /*分解出百位*/
        d=x%100/10;       /*分解出十位*/
        e=x%10;           /*分解出个位*/
        if (a!=0){
            printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n",e,d,c,b,a);
        } else if(b!=0) {
             printf("为 4 位数,逆序为: %ld %ld %ld %ld\n",e,d,c,b);
        } else if(c!=0) {
             printf("为 3 位数,逆序为:%ld %ld %ld\n",e,d,c);
        } else if(d!=0) {
             printf("为 2 位数,逆序为: %ld %ld\n",e,d);
        } else if(e!=0) {
             printf("为 1 位数,逆序为:%ld\n",e);
        }
        return 0;
    }
    
    

    2.有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成程最前面的m个数。

    /**
        这题的实现方法有好多,经典的有海豚循环
        次算法思路:移动下标,比如向后移动3位,则7、8、9下标分别
        移动到了数组的0、1、2.创建一个临时变量,先存储a[7],然后将
        前六个数向后移动一个,最后将a[7]赋值给a[0]。8、9的移动方法
        相似。
    */
    #define N 10
    int main()
    {
        int a[N],i,j,k,m,temp;
        printf("请输入%d个数字:\n",N);
        for(i=0;i<N;i++)
        scanf("%d",&a[i]);
        printf("输入需要前移的数字的个数:");
        scanf("%d",&m);
        for(i=N-m,k=0;i<N;i++,k++){
            temp=a[i];
            for(j=i-1;j>=k;j--){
                a[j+1]=a[j];
            }
            a[k]=temp;
        }//数据向后移动结束
         for(i=0;i<N;i++)
         printf("%d ",a[i]);
        return 0;
    }
    
    

    3.某校规定学生学习程序设计课的成绩可根据其参加程序设计大奖赛的成绩适度加分。加分规则:参赛者加5分、三等奖加15分、二等奖加20分、一等奖加30分,总分不超过100分。编程,输入学生考试成绩及参加大赛的成绩,计算某同学的程序设计课成绩并输出。

    int main()
    {
        int score,price_num;
        printf("请输入学生成绩:\n");
        scanf("%d",&score);
        printf("请输入该学生在比赛中是否获奖:\n1.表示获得一等奖。\n2.表示获得二等奖。\n3.表示获得三等奖。\n0.表示未获奖。\n");
        scanf("%d",&price_num);
        switch(price_num){
        case 1:
            if(score+30>100){
                printf("该学生程序设计课成绩为%d分",100);
            }else{
                printf("该学生程序设计课成绩为%d分",score+30);
            }
            break;
        case 2:
            if(score+20>100){
                printf("该学生程序设计课成绩为%d分",100);
            }else{
                printf("该学生程序设计课成绩为%d分",score+20);
            }
            break;
        case 3:
            if(score+15>100){
                printf("该学生程序设计课成绩为%d分",100);
            }else{
                printf("该学生程序设计课成绩为%d分",score+15);
            }
            break;
        case 0:
            if(score+5>100){
                 printf("该学生程序设计课成绩为%d分",100);
            }else{
                printf("该学生程序设计课成绩为%d分",score+5);
            }
            break;
        }
        return 0;
    }
    

    4.编一程序统计一字符串中数字及字母分别出现的个数,要求将统计字符串中的数字及字母个数的程序写成函数,主程序输入字符串,调用此函数并输出结果。

    void countNum(char *str){
        char *p=str;
        int i = 0,count_char=0,count_num=0;
        while(p[i]!='\0'){
            //i++;注意i++不能放在这里,也不能写成p[i++]!='\0';一开始就是这样写的,总是出现少统计一个数。
            if(p[i]>='0'&&p[i]<='9'){
                count_num++;
            }else if(p[i]>='A'&&p[i]<='Z'||p[i]>='a'&&p[i]<='z'){
                count_char++;
            }
            i++;
        }
        printf("字符的个数是:%d,数字的个数是:%d",count_char,count_num);
    }
    
    int main()
    {
        char str[100];
        printf("请输入字符串:\n");
        gets(str);
        countNum(str);
        return 0;
    }
    
    

    5.学生某门课程成绩信息包括以下信息:学号、姓名、考试科目、平时成绩、实验上机成绩、期末卷面成绩、课程成绩。建立描述一名学生课程成绩的数据类型,若课程成绩=平时成绩20%+实验上机成绩25%+期末卷面成绩*55%则编程实现以下功能:(1)输入某班n个学生某门课程成绩信息(只需输入学号、姓名、考试科目、平时成绩、实验上机成绩、期末卷面成绩、课程成绩由程序根据上述公式计算可得。)(2)统计该门课程全班平均成绩。(3)输出全班同学中大于平均成绩的学生信息(包括学号、姓名、考试科目、课程成绩)。(4)输出全班同学中不及格学生信息(包括学号、姓名、考试科目、课程成绩)。要求上述功能分别用函数实现。主函数通过调用上述函数完成。

    //打印格式有些许问题,在此不做过分要求
    typedef struct students{
        long studentID;
        char studentName[10];
        char studentSubject[20];
        float psScore;
        float sjScore;
        float jmScore;
        float kcScore;
    } Stu;
    
    float aver;
    
    //输入成绩
    void InputScore(Stu stu[],int n){
        int i;
        for(i=0;i<n;i++){
            printf("请输入第%d个学生成绩:\n",i+1);
            scanf("%ld",&stu[i].studentID);
            scanf("%s",&stu[i].studentName);
            scanf("%s",&stu[i].studentSubject);
            scanf("%f",&stu[i].psScore);
            scanf("%f",&stu[i].sjScore);
            scanf("%f",&stu[i].jmScore);
            stu[i].kcScore=stu[i].psScore*0.2+stu[i].sjScore*0.25+stu[i].jmScore*0.55;
        }
    }
    
    //求平均成绩
    void AverScore(Stu stu[],int n){
        int i;
        float sum=0;
        for(i=0;i<n;i++)
            sum =sum + stu[i].kcScore;
        aver = sum/n;
        printf("全班平均成绩:%.2f\n",aver);
    }
    
    //求高于平均成绩的学生
    void HightAver(Stu stu[],int n){
        int i;
        printf("高于平均成绩的同学:\n");
        for(i=0;i<n;i++)
        {
            if(stu[i].kcScore>aver){
                printf("%10ld%8s%15s%5.2f\n",stu[i].studentID,stu[i].studentName,stu[i].studentSubject,stu[i].kcScore);
            }
        }
    }
    
    //求不及格的学生
    void LowScore(Stu stu[],int n){
        int i;
        printf("不及格学生信息:\n");
        for(i=0;i<n;i++)
        {
            if(stu[i].kcScore<60){
                printf("%10ld%8s%15s%5.2f\n",stu[i].studentID,stu[i].studentName,stu[i].studentSubject,stu[i].kcScore);
            }
        }
    }
    
    int main()
    {
        Stu stu[40];
        int n;
        printf("please enter student number:\n");
        scanf("%d",&n);
        InputScore(stu,n);
        AverScore(stu,n);
        HightAver(stu,n);
        LowScore(stu,n);
        return 0;
    }
    
    
    

    试卷五

    1.有一分数序列:2/1,3/2,5/3,13/8,21/13.....求这个数列的前20项之和。

    /**
    考查:循环结构,储存位置替换
    */
    int main()
    {
        int n=20,a=1,b=2,i,C;
        float Sum;
        for(i=0;i<n;i++){
            Sum += b/a;
            C = a + b;
            a = b;
            b = C;
        }
        printf("前20项的和是%.2f",Sum);
        return 0;
    }
    
    

    2.编写一函数,从键盘输入字符串,将字符串中ASCII值为奇数的字符删除,串中剩余的字符形成一个新的字符数组。

    int main()
    {
        char a[80],b[80];
        int i=0,j=0;
        gets(a);
        while(a[i]!='\0'){
            if(a[i]%2==0)
                b[j++] = a[i];
            i++;
        }
        b[j]='\0';
        puts(b);
        return 0;
    }
    

    3.请编写函数 void fun(int x,int *n),它的功能是:求出能被x整除且不是偶数的各整数,并按从小到大的顺序存放在 pp 所指的数组中,这些除数的个数通过形参 n 返回。

    /**
    A/B=C...
    被整除:就是说A被B整除
    整除:就是B整除A
    */
    void funn(int x, int pp[], int *n)
    {
        int i,j=0;
        for (i = 1;i <= x;i++)
            if ((x%i == 0)&&(i%2==1))
            {
                pp[j] = i;
                j++;
            }
        *n = j;
    }
    
    int main()
    {
        int x, aa[1000], n, i;
        printf("Please enter an integer number:\n");
        scanf("%d", &x);
        funn(x, aa, &n);
        for (i = 0;i < n;i++)
            printf(" %d ", aa[i]);
        printf("\n");
        return 0;
    }
    
    

    试卷六

    1.用1元人民币兑换5分、2分、1分的硬币共50枚,每种硬币至少一枚,问共有多少种兑换方案?输出每一种方案三种硬币数量。

    //我的方法效率比较高,循环的次数少
    int main()
    {
        //一元等于一百分,循环
        int five_num,two_num,one_num,n=100,count=0,sum=50;
        for(five_num=1;five_num<=n/5;five_num++){
            for(two_num=1;two_num<=sum-five_num;two_num++){
                for(one_num=1;one_num<=sum-five_num-two_num;one_num++){
                    if(five_num*5+two_num*2+one_num==100&&five_num+two_num+one_num==50){
                        count++;
                        printf("五分硬币有:%d枚,二分的硬币有:%d枚,一份的硬币有:%d枚\n",five_num,two_num,one_num);
                    }
                }
            }
        }
        printf("共有%d种兑换方法。",count);
        return 0;
    }
    
    //解法二
    main()
    {
        int x,y,z,i=0;
        for(x=1;x<100;x++)
        for(y=1;y<50;y++)
        for(z=1;z<20;z++)
        if((x+y+z==50)&&(x+2*y+5*z==100))
        {
            i++;
            printf("num%d:%d,%d,%d\n",i,x,y,z);
        }
    }
    

    2.编写一函数,求出 fibonacci(斐波那契数列) 中大于 t 的最小一个数,结果由函数返回。

    //解答本题的关键是要充分理解题意,只有理解了题意本身的数学过程,才能把数学过程转化为程序逻辑。
    /**
        这题写的很好,参考网上的答案,采用的是递归
    */
    int Fibonacci(int n){
        if(n==1||n==2) return 1;
        else return(Fibonacci(n-1)+(n-2));
    }
    
    int Result(int t){
        int R;
        for(int i=1;;i++){
            if(Fibonacci(i)>t){
                 R=Fibonacci(i);
                 break;
            }
        }
        return R;
    }
    
    int main()
    {
        int t=5;
        printf("%d",Result(t));
        return 0;
    }
    
    

    3.编写一函数,对一个字符串,除首尾字符外,将其余字符按ASCII码降序排列。

    void px(char *p){
        int i,n,temp;
        n = strlen(p);
        for(i=2;i<n-1;i++){
            if(p[i-1]<p[i]){
                temp = p[i-1];
                p[i-1] = p[i];
                p[i] = temp;
            }
        }
        for(i=1;i<n-1;i++){
            printf("%c",p[i]);
        }
    
    }
    
    //编写一函数,对一个字符串,除首尾字符外,将其余字符按ASCII码降序排列
    int main()
    {
        char s[60];
        gets(s);
        px(s);
        return 0;
    }
    
    

    4.用指针实现,定义一个 4*4 的二维数组,并在主函数中赋值。编写一个 fun 函数,求出数组周边元素的平均值并作为函数值返回。

    //一开始自己是这样写的:float qiuAver(int arr[]){}注意了,这里处理的是二维数组,千万不能这样传。
    float qiuAver(int arr[4][4]){
        int sum=0,zhouSum,neiSum=0,i,j;
        int n = 12;//外边有12个数。
        float aver;
         for(i=0;i<4;i++){
            for(j=0;j<4;j++){
                sum += arr[i][j];
            }
        }
        for(i=1;i<=2;i++){
            for(j=1;j<=2;j++){
                neiSum += arr[i][j];
            }
        }
    
        zhouSum = sum - neiSum;
        aver = zhouSum/n;
        return aver;
    
    }
    
    int main()
    {
        int arr[4][4],i,j,k=1;
        for(i=0;i<4;i++){
            for(j=0;j<4;j++){
                arr[i][j] = k++;
            }
        }
        float aver = qiuAver(arr);
        printf("数组周边元素的平均值:%f",aver);
        return 0;
    }
    
    

    试卷七

    1.10个学生包含学号、成绩信息,编写一个函数把分数最高的学生数据存放在另一个数组中。请注意分数最高的学生可能不止一个。

    typedef struct student{
        long id;
        float score;
    } Stu;
    
    void fun(Stu st[],Stu nst[]){
        int i,j=0;
        float max = st[0].score;
        //比较得到最高分
        for(i=0;i<10;i++){
            if(st[i].score>max){
                    max = st[i].score;
            }
        }
        //判断是否为最高分
        for(i=0;i<10;i++){
            if(st[i].score==max){
                nst[j++] = st[i];
            }
        }
    
        //打印最高分数组
        for(int k=0;k<j;k++){
            printf("%ld\n",nst[k].id);
        }
    }
    
    int main()
    {
        int i;
        Stu st[10],nst[10];
        for(i=0;i<10;i++){
            printf("请输入第%d个学生的成绩数据(学号 成绩):\n",i+1);
            scanf("%ld%f",&st[i].id,&st[i].score);
        }
        fun(st,nst);
        return 0;
    }
    

    2.从键盘输入两个字符串 a 和 b,要求不用库函数把串 b 的前五个字符连接到串 a 中,如果 b 的长度小于5,则把 b 的所有元素都连接到 a 中。

    /**
    1、定义a、b两个数组,在主函数中进行输入相应的字符串
    2、将a、b数组交给函数fun处理(也可直接在主函数中处理)
    3、通过strlen函数,得出字符串 a 的长度
    4、用循环将 b 中的字符放入 a 中,如果 b 的长度超过 5,则结束循环。(怎么感觉自己变聪明了,哈哈)
    */
    void fun(char *a,char *b){
        int a_length=strlen(a);
        //int b_length=strlen(b);
        int i,j=0;
            while(b[j]!='\0'){
                a[a_length] = b[j];
                j++;
                a_length++;
                if(j==5){
                    break;
                }
            }
            a[a_length] = '\0';
            puts(a);
    }
    
    int main()
    {
        char a[50],b[50];
        gets(a);
        gets(b);
        fun(a,b);
        return 0;
    }
    
    

    刚开始犯了一个智障般的错误,将a,b定义成整型的数组了,传值的时候也定义成整形的,调试了半个小时!

    3.编写函数 fun(int m,int *k,int x[]),其功能是:将所有大于 1 小于整数 m 的非素数存入 x 所指数组中,非素数的个数通过 k 返回。

    /**
    素数:只能被1和自身外整数整除的数就是素数,反过来就不是素数了。
    */
    void fun( int m, int *k, int xx[] )
    {
     int i, j, a=0;
     for ( i=2; i<m; i++ ){
      for ( j=2; j<i; j++ ){
       if ( i%j == 0 ){
        xx[a++] = i;
        break;
       }
      }
     }
     *k = a;
    }
    
    int main()
    {
        int m,k,a[50];
        scanf("%d",&m);
        fun(m,&k,a);
        printf("非素数的个数是:%d",k);
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:巧妇难为无米之炊-算法

          本文链接:https://www.haomeiwen.com/subject/aumorftx.html