PTA MOOC循环结构

自我记录 仅供参考

7-1 求cosx的近似值 

已知cosx的近似计算公式如下:

cosx=1−x2/2!+x4/4!−x6/6!+...+(−1)nx2n/(2n)!

其中x为弧度,n为整数(0≤n≤100)。

现编写程序,根据用户输入的x和n的值,利用上述近似计算公式计算cosx的近似值(为保证数据准确,使用双精度浮点类型),输出结果时要求保留小数点后6位

输入格式:

输入表示弧度的实数 x ,以及整数 n。

输出格式:

按“cos(x)=近似值”格式输出计算结果,保留小数点后6位。

#include <stdio.h>
int main(){

    double x,cos=1,j;
    int n;
    scanf("%lf %d",&x,&n);

    int i,t=-1;
    j=x*x/2;
    for(i=2;i<=2*n;i=i+2){
        cos=cos+t*j;
        j=j*x*x/((i+1)*(i+2));
        t=-t;
    }

    printf("cos(%.6lf)=%.6lf",x,cos);

return 0;
}

不要直接用一个变量去储存n!哦,当n逐渐增大,n!会越来越大甚至超出数据类型所能存储的范围,比如int类型只能存储至16!,所以换一种方式吧。

7-2 评委评分

某次比赛有n个评委对参赛选手打分。编程输入各个评委的评分,去掉一个最高分和1个最低分后,输出该选手的平均分。

输入格式:

输入在第一行中给出正整数n,在第二行给出n个0~10之间的浮点数,用空格分开。

输出格式:

在一行中输出去掉最高分和最低分之后的平均分,精确到小数点后2位。

#include <stdio.h>

int main(){

    int n;
    float x,max,min,ave,s;
    scanf("%d",&n);
    scanf("%f",&x);
    max=x;min=x;s=x;

    int i;
    for(i=2;i<=n;i++){
        scanf("%f",&x);
        if(x>=max)max=x;
        if(x<=min)min=x;
        s=s+x;
    }

    printf("%.2f",(s-max-min)/(n-2));

return 0;
}

7-3 简写转全称

在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:

  • 每个简写字母对应一行输出
  • 若字符为Cc,则该行输出"BEIJING OLYMPIC GAMES"
  • 若字符为Jj,则该行输出"JAPAN WORLD CUP"
  • 若字符为Kk,则该行输出"KOREA WORLD CUP"
  • 若为其他字符,则该行原样输出该字符。

输入格式:

输入在一行中输入若干个字符,字符之间没有空格间隔,以回车结束。

输出格式:

按题目要求产生若干行输出。

#include <stdio.h>

int main(){

    char c;
    scanf("%c",&c);
    if(c=='C'||c=='c')printf("BEIJING OLYMPIC GAMES");
    else if(c=='J'||c=='j')printf("JAPAN WORLD CUP");
    else if(c=='K'||c=='k')printf("KOREA WORLD CUP");
    else printf("%c",c);

    while(1){
        scanf("%c",&c);if(c=='\n')break;
        if(c=='C'||c=='c')printf("\nBEIJING OLYMPIC GAMES");
        else if(c=='J'||c=='j')printf("\nJAPAN WORLD CUP");
        else if(c=='K'||c=='k')printf("\nKOREA WORLD CUP");
        else printf("\n%c",c);
    }

return 0;
}

7-4 统计整数的位数

从键盘读入一个整数,统计该数的位数。例如,输入12534,输出5;输入-99,输出2;输入0,输出1。

输入格式:

输入一个整数N(−105≤N≤105)。

输出格式:

在一行中按如下格式输出该数的位数。

It contains 位数 digits.

#include <stdio.h>

int main(){

    int n;
    scanf("%d",&n);

    int s=1;
    while(1){
        if((n/10)!=0){s=s+1;n=n/10;}
        else break;
    }

    printf("It contains %d digits.",s);

return 0;
}

7-5 穷举法搬运砖块问题 

这是中国古典算术问题,某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。有多少种搬法用N人正好搬N块砖?

输入格式:

输入正整数N。

输出格式:

输出所有满足条件的搬法,每种搬法占一行。

每行按如下格式依次输出该搬法中男人、女人、小孩的人数,按男人人数的递增顺序输出,中间用空格间隔(=前后没有多余的空格,行末也无空格)。

men=男人数 women=女人数 child=小孩数

若没有满足条件的搬法,则输出"No solution!"

#include <stdio.h>

int main(){

    int n;
    scanf("%d",&n);

    int i,j,k,s=0;
    for(i=0;i<=n/3;i++){
        for(j=0;j<=n/2;j++){
            for(k=0;k<=n;k=k+2){
                if(3*i+2*j+k/2==n&&i+j+k==n&&s==0){
                    printf("men=%d women=%d child=%d",i,j,k);
                    s++;
                }
                else if(3*i+2*j+k/2==n&&i+j+k==n&&s!=0){
                    printf("\nmen=%d women=%d child=%d",i,j,k);
                    s++;
                }
            }
        }
    }

    if(s==0)printf("No solution!");
return 0;
}

7-6 数字金字塔 

输入一个正整数repeat (repeat<10),做repeat次下列运算:

  • 输入一个正整数n(n<10),输出n行数字金字塔。

输出时使用以下语句:

  • printf(" ");
  • printf("%d ", i);
  • printf("\n");

输入格式:

输入在第1行中给出1个正整数repeat(repeat<10)

接下来repeat行,每行给出一个正整数n(n<10)

输出格式:

按照对应顺序的n值,依次输出repeat个数字金字塔 (n行数字金字塔的格式如样例所示,注意:每个数字后面跟一个空格。)

#include <stdio.h>

int main(){

    int repeat;
    scanf("%d",&repeat);

    int i,j,k,n;
    for(i=1;i<=repeat;i++){
        scanf("%d",&n);
        for(j=1;j<=n;j++){
            for(k=1;k<=(n-j)*2;k++)
                printf(" ");
            for(k=1;k<=j*2-1;k++)
                printf("%d ",j);
            if(i==repeat&&j==n)break;
            printf("\n");
        }
    }

return 0;
}

(不是全部输入再处理而是一边输入一边处理 但是能通过pta测评)

  • 17
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是一个简单的二分查找的完整代码实现,该代码实现了在有序数组查找指定元素的功能。 ```c++ #include <iostream> using namespace std; int binarySearch(int arr[], int left, int right, int x) { while (left <= right) { int mid = left + (right - left) / 2; // 如果 x 在间 if (arr[mid] == x) return mid; // 如果 x 大于间元素,只需要在右半部分搜索 if (arr[mid] < x) left = mid + 1; // 如果 x 小于间元素,只需要在左半部分搜索 else right = mid - 1; } // 如果 x 没有在数组找到,返回 -1 return -1; } int main() { int arr[] = { 2, 3, 4, 10, 40 }; int n = sizeof(arr) / sizeof(arr[0]); int x = 10; int result = binarySearch(arr, 0, n - 1, x); if (result == -1) cout << "元素不在数组!"; else cout << "元素在数组的索引为:" << result; return 0; } ``` 在上面的代码,`binarySearch` 函数是实现二分查找的主要函数。该函数接受四个参数:要搜索的数组 `arr`,搜索范围的左边界 `left`,搜索范围的右边界 `right`,以及要查找的元素 `x`。 函数使用一个 while 循环来查找元素,只要搜索范围还没有缩小到只包含一个元素,就继续执行循环。在每次循环,函数会计算搜索范围的间位置 `mid`。然后,函数会检查间位置的元素是否等于要查找的元素。如果是,函数会返回间位置的索引。 如果间位置的元素小于要查找的元素,那么要查找的元素只可能出现在间位置的右侧。因此,函数会将搜索范围的左边界移到间位置的右边一位。如果间位置的元素大于要查找的元素,那么要查找的元素只可能出现在间位置的左侧。因此,函数会将搜索范围的右边界移到间位置的左边一位。 如果在循环结束时还没有找到要查找的元素,函数会返回 -1,表示元素不在数组。否则,函数会返回要查找的元素在数组的索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值