MENU

C语言实验+应用作业 5

2017 年 11 月 23 日 • 日常作业

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

编程题1
编写程序:求1+2+3+…+100和12+22+33+…+1002。
输入输出示例
sum1=5050 sum2=338350

#include <stdio.h>

int main()
{
    int i,sum=0,sqsum=0;
    for(i=1;i<=100;i++){
        sum+=i;
        sqsum+=i*i;
    }
    printf("sum1=%d sum2=%d\n",sum,sqsum);
    return 0;
}

编程题2
一个数如果恰好等于它的因子之和,这个数就称为“完数”,编写程序找出2~5000中的所有完数。
输入输出示例
6 28 496

#include <stdio.h>

int main()
{
    int n,i=2,sum=1;
    for (n=2;n<=5000;n++,sum=1,i=2){
        for (;i<n;i++){
            if (n%i==0) sum+=i;
        }
        if (n==sum){
            printf("%6d",n);
        }
    }
    printf("\n");
    return 0;
}

编程题3
编写程序:计算sinx的近似值,精确到10-6。其中x为弧度,由用户从键盘输入。
(公式懒得写了)
输入输出示例
第一次运行:
请输入一个x值(弧度值):0
sin(0.00)=0.000000
第二次运行:
请输入一个x值(弧度值):1.57
sin(1.57)=1.000000

#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
int jc(int n){
    if(n==0 || n==1) return 1;
    else if(n>1) return n*jc(n-1);
    else return -1;
}
int main()
{
    float x;
    printf("请输入一个x值(弧度值):");
    scanf("%f",&x);
    int i;
    double x1=x;
    /*while(x1<-PI) x1+=2.0*PI;
    while(x1>PI) x1-=2.0*PI;*/
    double rst=x1,tmp;
    for(i=2;i<10;i++){
        tmp=pow(x1,2*i-1.0)/(double)jc(2*i-1);
        if(x>0?tmp>0:tmp<0) rst+=tmp*(i%2==0?-1.0:1.0);
        else break; //防溢出
    }
    printf("sin(%.2f)=%.6lf\n",x,rst);
    return 0;
}

编程题4(选做)
编写一个程序,计算并输出能写成两个数平方之和的所有三位数的个数。
输入输出示例
num=274

#include <stdio.h>
#include <math.h>
int main()
{
    int n,a,b,num=0,flag=0;
    for(n=100;n<=999;n++,flag=0){
        int tmp=sqrt(n);
        for(a=1;a<=tmp&&!flag;a++){
            for(b=1;b<=n&&!flag;b++){
                if(n==a*a+b*b){
                    num++;
                    flag=1;
                }
            }
        }
    }
    printf("num=%d\n",num);
    return 0;
}

编程题5(选做)
编写程序,用户从键盘输入任意整数给n后,输出n行由大写字母A开始构成的三角形字符阵列图形。注意:n不得大于10。
输入输出示例
Enter n: 5
A B C D E
F G H I
J K L
M N
O

#include <stdio.h>

int main()
{
    int n;
    char ch='A'-1;
    printf("Enter n: ");
    scanf("%d",&n);
    if(n>10) printf("ERR:n>10\n");
    else if(n>0){
        int i;
        do{
            for(i=1;i<=n;i++){
                ch+=1;
                printf("%c ",ch);
            }
            printf("\n");
            n--;
        }while(n>0);
    }
    else printf("ERR:n<1\n");
    return 0;
}

1、金额转换:将一个小写的金额数字转换为大写输出。
提示:1、注意数字的取值范围;
2、注意连续的多个零,如:60021应表示为六万零二十一,而不是六万零千零百二十一;
3、金额的各位大写采用简体中文:十百千万;
4、数字的大写采用简体中文:零一二三四五六七八九。

#include <stdio.h>
//十拾 百佰 不是简体繁体的区别好不
__int64 pow10(int n){
    if(n==0) return 1;
    else if(n>0) return 10*pow10(n-1);
    else return -1;
}
void printNum(int n){
    switch(n){
        case 9:printf("九");break;
        case 8:printf("八");break;
        case 7:printf("七");break;
        case 6:printf("六");break;
        case 5:printf("五");break;
        case 4:printf("四");break;
        case 3:printf("三");break;
        case 2:printf("二");break;
        case 1:printf("一");break;
        case 0:printf("零");break;
    }
}
void printUni(int n){
    switch(n%4){
        case 1:printf("千");break;
        case 2:printf("百");break;
        case 3:printf("十");break;
        case 0:break;
    }
}
//999999999999 564156 60021 1500 52000000 700001 8010500 8002050 6000000000 7000000400
int main()
{
    __int64 n;
    int l[13],lStart=12;
    scanf("%I64d",&n);
    if(n>999999999999) printf("错误:本程序不支持超过千亿的数!");
    else if(n==0) printf("零\n");
    else if(n>0){
        //个 万 亿
        int i,zeroed=0;
        for(i=1;i<=12;i++){
                l[i]=n/pow10(12-i)%10;
                if(l[i]!=0&&lStart==12) lStart=i;
        }
        /*for(i=1;i<=12;i++){
                printf("%d ",l[i]);
        }*/
        for(i=lStart;i<=12;i++){
            if(l[i]==0){
                zeroed++;
            }else{
                if(zeroed && i!=4+1 && i!=8+1) printNum(0); //输出之前缓冲的0
                zeroed=0;
                printNum(l[i]);
                printUni(i);
            }
            if(i==4){
                if(zeroed!=4) printf("亿");
                zeroed=0;
            }else if(i==8){
                if(zeroed!=4) printf("万");
                zeroed=0;
            }

        }
        printf("\n");
    }else{
        printf("错误:应该输入一个非负数!");
    }
    return 0;
}

2、超级素数:一个素数,依次从低位去掉一位,二位,……,若所得的各数仍都是素数,则称超级素数。例如:7331是个4位超级素数,因为7,73,733,7331均为素数. 试求1000~n之内所有超级素数。

#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 n,i;
    printf("n=");
    scanf("%d",&n);
    if(n>1000){
        for(i=1000;i<=n;i++)
            if(is_suPri(i)) printf("%d\t",i);
    }else if(n>0){
        printf("EER: Please input a number more than 1000.");
    }else{
        printf("ERR: Too big.");
    }
    printf("\n");
    return 0;
}

<p>3、输出n行杨辉三角形,如下

                            1 

                         1   1    

                       1   2   1    

                     1   3   3   1    

                   1   4   6   4   1    

                 1   5   10  10  5   1    

               1   6   15  20  15  6   1    

             1   7   21  35  35  21  7   1    

           1   8   28  56  70  56  28  8   1    

         1   9   36  84  126 126 84  36  9   1    

       1   10  45  120 210 252 210 120 45  10  1    

     1   11  55  165 330 462 462 330 165 55  11  1     

   1   12  66  220 495 792 924 792 495 220 66  12  1 </p>
</blockquote>

#include <stdio.h>
#include <string.h>
#define LINESTR 80
char center[LINESTR]={0};
int printCenter(char*);
int putIntToChar(int,char*);

int main(){
    int arr[18][18],n,i,j;
    char _space[]=" ";
    printf("n=");
    scanf("%d",&n);
    if(n<=0){
        printf("ERR: Less than 1.\n");
    }else if(n<=17){
        arr[1][1]=1;
        for(i=2;i<=n;i++){
            arr[i][1]=1;
            arr[i][i]=1;
            for(j=2;j<i;j++)
                arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=i;j++){
                strcat(center,_space);
                putIntToChar(arr[i][j],center);
            }
            printCenter(center);
        }
    }else{
        printf("ERR: Only no more than 17 lines supported!\n");
    }
    return 0;
}
int printCenter(char str[LINESTR]){
    int len=strlen(str);
    if(len>LINESTR){
        return 0;
    }else{
        char printCache[LINESTR]={0};

        //strset(printCache,' ',(LINESTR-len)/2);
        int i;
        for(i=0;i<(LINESTR-len)/2;i++)
            printCache[i]=' ';
        printCache[i]=0;

        strcat(printCache,str);
        printf("%s\n",printCache);
        strset(str,0);
        return 1;
    }
}
int putIntToChar(int n,char str[LINESTR]){
    if(n<0){
        return 0;
    }else{
        char theInt[15]={0};
        int i=0;
        do{
            theInt[i]=n%10+'0';
            i++;
            n=n/10;
        }while(n!=0);
        theInt[i]=0;
        strrev(theInt);
        strcat(str,theInt);
        return 1;
    }
}

4、字符串移动:将一个字符串向左(向右)移动n位,移出的字符放置在串尾(串首),形成一个新的字符串;然后输出新的字符串。

#include <stdio.h>
#include <string.h>
int main(){
    char str[101],newStr[101]={0};
    int n,length;
    printf("输入一个字符串 (不超过100个字符):\n");
    scanf("%s",str);
    printf("字符串将向右移动几位?(输入负数则将向左移动) n=");
    scanf("%d",&n);
    int i;
    length=strlen(str);
    if(n>0){
        while(n>length) n-=length;
        for(i=length-n;i<length;i++){
            newStr[i-length+n]=str[i];
        }
        for(i=n;i<length;i++){
            newStr[i]=str[i-n];
        }
        printf("移动后的字符串为:\n%s\n",newStr);
    }else if(n<0){
        n=-n;
        while(n>length) n-=length;
        for(i=0;i<n;i++){
            newStr[i+length-n]=str[i];
        }
        for(i=0;i<length-n;i++){
            newStr[i]=str[i+n];
        }
        printf("移动后的字符串为:\n%s\n",newStr);
    }else{ //n==0
        printf("字符串未发生移动:\n%s\n",newStr);
    }
    return 0;
}

原发于 2016-12-02 17:12