MENU

C语言应用单元测试 4

2017 年 11 月 23 日 • 日常作业

这是我的作业和我的答案,供将来自己检索,和大家参考之用。

1、打印10~1000之间满足下列条件的所有数: 正序读和反序读都相同,例如:55、232等。

#include <stdio.h>

int is_wanted(int n){
    int bits,l[4+1],i,tmp; //bts<=4
    for(tmp=n,bits=1;tmp/10;tmp=tmp/10,bits++) ;
    for(tmp=n,i=1;i<=bits;i++){
        l[i]=tmp%10;
        tmp=tmp/10;
    }
    for(i=1;i<=bits/2;i++){
        if(l[i]!=l[bits-i+1]) return 0;
    }
    return 1;
}
int main(){
    int i;
    for(i=10;i<=1000;i++)
        if(is_wanted(i)) printf("%d\t",i);
    printf("\n");
    return 0;
}

2、从键盘任意输入一个大于0且小于1000的整数,然后输出此整数的所有整数因子。 例如:输入12,输出1,2,3,4,6,12。

#include <stdio.h>

int main(){
    int n,i;
    do{
        scanf("%d",&n);
        if(n<=0||n>=1000) printf("输入错误,程序将要求您重新输入!");
    }while(n<=0||n>=1000);
    for(i=1;i<=n;i++){
        if(n%i==0) printf("%d\t",i);
    }
    printf("\n");
    return 0;
}

3、函数void dele(char *s)的功能是删除字符串s中的所有数字字符和非字母字符,并将字符串压缩。例如原字符串为:abc12ef5ghij8#%%yz,处理后的字符串为:abcefghijyz。

#include <stdio.h>
#include <string.h>
int is_letter(char ch){
    return (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z');
}
void dele(char *s){
    int i,j,leng=strlen(s);
    for(i=0;s[i];i++){
        if(!is_letter(s[i])){
            for(j=i;s[j];j++) s[j]=s[j+1];
            i--;
        }
    }
}
int main(){
    char str[]="abc12ef5ghij8#%%yz";
    printf("原字符串:");
    puts(str);
    dele(str);
    printf("新字符串:");
    puts(str);
    printf("\n");
    return 0;
}

4、马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?

#include <stdio.h>

int main(){
    int men,women,kids;
    for(men=1;men<30;men++){
        for(women=1;women<30;women++){
            kids=30-men-women;
            if(men*3+women*2+kids*1==50)
                printf("(%d,%d,%d)\n",men,women,kids);
        }
    }
    return 0;
}

5、10个小孩围成一圈分糖果,老师顺次分给每个人的糖块数为12,2,8,22,16,4,10,6,14,20。然后按下列规则调整,所有小孩同时把自己的糖果分一半给右边的小孩,糖块数变为奇数的人,再向老师补要一块,问经过多少次调整后,大家的糖块一样多,且每人多少块。

#include <stdio.h>

int allEqual(int arr[10]){
    int i;
    for(i=1;i<10;i++){
        if(arr[i]!=arr[0]) return 0;
    }
    return 1;
}
int main(){
    int que[10]={12,2,8,22,16,4,10,6,14,20},tmp[10],times=0,i;
    do{
        for(i=0;i<10;i++){
            tmp[i]=que[i]/2;
            que[i]=que[i]/2;
        }
        for(i=1;i<10;i++){
            que[i]=+tmp[i-1]; //假设编号大的人是在编号小的人右边
        }
        que[0]=tmp[9];
        /*for(i=0;i<10-1;i++){
            que[i]=+tmp[i+1]; //假设编号小的人是在编号大的人右边
        }
        que[9]=tmp[0];*/

        for(i=0;i<10;i++){
            if(que[i]%2!=0) que[i]+=1;
        }

        times++;
    }while(!allEqual(que));
    printf("%d次后大家都是%d块糖果。\n",times,que[0]);
    return 0;
}

6、韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。编程求韩信至少有多少兵?

#include <stdio.h>

//除以5余1,除以6余5,除以7余4,除以11余10
int main(){
    int i;
    for(i=11+10;i<1000000;i++){
        if(i%5==1&&i%6==5&&i%7==4&&i%11==10){
            printf("%d\t",i);
            //break;
        }
    }
    printf("\n以上均是 1,000,000 以内可能的结果。\n");
    return 0;
}

(此文为定时发布)

原发于 2016-12-29 23:32