MENU

C语言实验+应用作业 6

2017 年 11 月 23 日 • 日常作业

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

编程题1
写出两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。
输入输出示例
输入:n1=24 n2=16
输出:zdgys=8 zxgbs=48

#include <stdio.h>

int yue(int a,int b){
    if(a<=1||b<=1) return 0;
    int rtn;
    for(rtn=a<b?a:b;a%rtn!=0||b%rtn!=0;rtn--) ;
    return rtn;
}
int bei(int a,int b){
    if(a<=1||b<=1) return 0;
    int rtn;
    for(rtn=a>b?a:b;rtn%a!=0||rtn%b!=0;rtn++) ;
    return rtn;
}
int main()
{
    int n1,n2;
    printf("n1=");scanf("%d",&n1);
    printf("n2=");scanf("%d",&n2);
    if(n1>1&&n2>1) printf("zdgys=%d  zxgbs=%d\n",yue(n1,n2),bei(n1,n2));
    else printf("ERR: Input error!");
    return 0;
}

编程题2
一个素数,依次从低位去掉一位,二位,……,若所得的各数仍都是素数,则称超级素数。试求[100,9999]之内:(1)超级素数的个数 (2)所有超级素数之和(3)最大的超级素数。
输入输出示例
num=30, sum=75548, max=7393

#include <stdio.h>

int is_prime(int n){
    if(n<=1){
        return 0;
    }else{
        int i;
        for(i=2;i*i<=n;i++){
            if(n%i==0) return 0;
        }
        return 1;
    }
}
int is_suPri(int n){
    do{
        if(!is_prime(n)) return 0;
        n=n/10;
    }while(n!=0);
    return 1;
}
int main(){
    int i,inAll=0,sum=0,max=0;
    for(i=100;i<=9999;i++)
        if(is_suPri(i)){
            inAll++;
            sum+=i;
            max=i;
        }
    printf("num=%d, sum=%d, max=%d\n",inAll,sum,max);
    return 0;
}

编程题3
用递归方法求n阶勒让德多项式的值,递归公式为

      1 (n=0)
Pn(x)=   x (n=1)
     ((2n-1)x Pn-1(x)-(n-1) Pn-2(x))/n (n>1)

输入输出示例
第一次运行:
请输入n和x的值:0,7
P0(7)=1.00
第二次运行:
请输入n和x的值:1,2
P1(2)=2.00
第三次运行:
请输入n和x的值:3,4
P3(4)=154.00

#include <stdio.h>

float P(int n,int x){
    if(n==0){
        return 1;
    }else if(n==1){
        return x;
    }else if(n>1){
        return ((2.0*n-1)*x*P(n-1,x)-(n-1.0)*P(n-2,x) )/n;
    }else{
        return EOF;
    }
}
int main(){
    int n,x;
    printf("请输入n和x的值:");
    scanf("%d,%d",&n,&x);
    printf("P%d(%d)=%.2f\n",n,x,P(n,x));
    return 0;
}

编程题4(选做)
满足下列条件的自然数称为超级素数:该数本身、所有数字之和、所有数字之积以及所有数字 的平方和都是素数。例如113就是一个超级素数。求[100,999]之内:(1)超级素数的个数。(2)所有超级素数之和(3)最大的超级素数。
输入输出示例
num=3 sum=555 max=311

#include <stdio.h>

int is_prime(int n){
    if(n<=1){
        return 0;
    }else{
        int i;
        for(i=2;i*i<=n;i++){
            if(n%i==0) return 0;
        }
        return 1;
    }
}
int is_suPri(int n/* given a 3 bits number */){
    int l3=n/100,l2=n/10%10,l1=n%10;
    if(is_prime(n) && is_prime(l3+l2+l1) && is_prime(l3*l2*l1) && is_prime(l3*l3+l2*l2+l1*l1))
        return 1;
    else
        return 0;
}
int main(){
    int i,inAll=0,sum=0,max=0;
    for(i=100;i<=999;i++)
        if(is_suPri(i)){
            inAll++;
            sum+=i;
            max=i;
        }
    printf("num=%d, sum=%d, max=%d\n",inAll,sum,max);
    return 0;
}

编程题5(选做)
求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于0,等于0和小于0时的根,并输出结果。从主函数输入a,b,c的值。
输入输出示例
Input a,b,c: 1,2,1
equation:1.00xx+2.00*x+1.00=0
root:x1=-1.00 x2=-1.00

#include <stdio.h>
#include <math.h>
void solveM(float a,float b,float c){  //delta>0
    float x1=(-b+sqrt(b*b-4*a*c)) / (2*a),x2=(-b-sqrt(b*b-4*a*c)) / (2*a);
    printf("x1=%.2f  x2=%.2f\n",x1,x2);
}
void solveE(float a,float b,float c){  //delta=0
    float x=(-b) / (2*a);
    printf("x1=%.2f  x2=%.2f\n",x,x);
}
void solveL(float a,float b,float c){  //delta<0
    float r=(-b) / (2*a),v=(sqrt(4*a*c-b*b)) / (2*a);
    printf("x1=%.2f+%.2fi  x2=%.2f-%.2fi\n",r,v,r,v);
}
int main(){
    float a,b,c,delta;
    printf("Input a,b,c: ");
    scanf("%f,%f,%f",&a,&b,&c);
    printf("equation: %.2f*x*x+%.2f*x+%.2f=0\n",a,b,c);
    delta=b*b-4*a*c;
    if(delta>0) solveM(a,b,c);
    else if(delta==0) solveE(a,b,c);
    else solveL(a,b,c);
    return 0;
}

1、二进制加法:有两个相同长度的二进制序列,请求出他们的二进制和,需要考虑进位。比如:10+10=100

#include <stdio.h>

__int64 pow(int a,int n){
    if(n==0) return 1;
    else if(n>0) return a*pow(a,n-1);
}
__int64 bin2dec(__int64 bin){
    int i=1,dec=0;
    do{
        dec+=bin%10*pow(2,i-1);
        i++;
        bin=bin/10;
    }while(bin);
    return dec;
}
__int64 dec2bin(__int64 dec){
    int i=1,bin=0;
    do{
        bin+=dec%2*pow(10,i-1);
        i++;
        dec=dec/2;
    }while(dec);
    return bin;
}
int main()
{
    __int64 a,b,sum;
    scanf("%I64d%I64d",&a,&b);
    sum=bin2dec(a)+bin2dec(b);
    printf("%I64d+%I64d=%I64d\n",a,b,dec2bin(sum));
    return 0;
}

2、第几天:输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

#include <stdio.h>
int main()
{
    int day=0;      // 日期
    int month=0;    // 月份
    int year=0;     // 年份
    int sum=0;      // 一年中的第几天    
    printf("请输入 年 月 日,如 2016 3 15:");
    scanf("%d", &year);
    scanf("%d", &month);
    while(--month){
        switch(month){
            case 1:case 3:case 5:case 7:case 8:case 10:case 12:sum+=31;break;
            case 4:case 6:case 9:case 11:sum+=30;break;
            case 2:
                if(year%4==0&&year%100!=0||year%400==0) sum+=29;
                else sum+=28;
        }
    }
    sum+=day;
    printf("%d\n", sum);    
    return 0;
}

3、换汽水:1瓶汽水卖1块钱,顾客还可以用3个空汽水瓶换1瓶汽水喝。请问聪明的顾客最少可以花多少钱买到n瓶汽水喝?说明:当顾客手中有两个空汽水瓶的时候,如果店家剩余1瓶以上,可以选择先借用1瓶汽水,喝完后连同手里先前已有的两个空汽水瓶还给店家即可。

#include <stdio.h>

int makeTheMost(int price){
    int ful=price,emp=0,n=price;
    emp+=ful; ful=0; //喝完
    while(emp>=3){
        ful+=1; emp-=3; //3空瓶换1瓶
        n+=1;
        emp+=ful; ful=0; //喝完
    }
    if(emp==2){
        ful+=1; emp=0;
        n+=1;
        ful=0;
    }
    //printf("ful=%d, emp=%d, n=%d",ful,emp,n);
    return n;
}
int main()
{
    int n,price;
    printf("n=");
    scanf("%d",&n);
    if(n>0){
        for(price=1;makeTheMost(price)<n;price++) ;
        printf("price=%d\n",price);
    }else{
        printf("ERR: Please input a positive number!\n");
    }
    return 0;
}

4、统计单词个数:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。例如,输入:I am a boy,里面包含了四个英文单词。

#include <stdio.h>

int isLetter(char ch){
    return (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z');
}
int main()
{
    char ch=0,lastCh;
    int words=0;
    do{
        lastCh=ch;
        ch=getchar();
        if(ch==' ' && isLetter(lastCh)) words+=1;
        if(ch=='\n' && lastCh!=' ') words+=1; //add 1
    }while(ch!='\n');
    printf("%d words.",words);
    return 0;
}

原发于 2016-12-02 17:26