本周训练总结

L1-027 出租 (20 分)

下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

18013820100

结尾无空行

输出样例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

结尾无空行

 思路:用字符串的形式存入号码,以桶排序方法存入数据,在定义一个数组,以递减的形式存下数字,在循环判断,把下标存入另一个数组,最后输出。

#include <stdio.h>
int main()
{
    char a[11];
    int b[10],c[11],d=0,x[11];
    for(int j=0;j<10;j++)
        b[j]=0;
    scanf("%s",a);
    //printf("%s ",a);
    for(int i=0;i<11;i++)
    {
        for(int j=0;j<10;j++)
            if((int)a[i]-48==j)//0的码为48,所以转化时要减48才为那位置的数。
            {b[j]++;}
    }
        
    for(int j=9;j>=0;j--)
        if(b[j]>0)
        {x[d]=j;d++;}
    //printf("%d\n",d);
    for(int i=0;i<11;i++)
        for(int j=0;j<d;j++)
            if((int)a[i]-48==x[j])
            {c[i]=j;break;}
    printf("int[] arr = new int[]{");
    for(int j=0;j<d-1;j++)
        printf("%d,",x[j]);
    printf("%d};\n",x[d-1]);
    printf("int[] index = new int[]{");
    for(int i=0;i<10;i++)
        printf("%d,",c[i]);
    printf("%d};",c[10]);
    return 0;
}

L1-076 降价提醒机器人 (10 分)

小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。

输入格式:

输入第一行是两个正整数 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 条价格记录,小 T 设置的价格为 M。

接下来 N 行,每行有一个实数 Pi​(−1000.0<Pi​<1000.0),表示一条价格记录。

输出格式:

对每一条比设定价格 M 便宜的价格记录 P,在一行中输出 On Sale! P,其中 P 输出到小数点后 1 位。

输入样例:

4 99
98.0
97.0
100.2
98.9

结尾无空行

输出样例:

On Sale! 98.0
On Sale! 97.0
On Sale! 98.9

结尾无空行

思路:就是循环输入数据进行比较,小于就输出。

#include <stdio.h>
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    double a;
    while(n--)
    {
        scanf("%lf",&a);
        if(a<m)
            printf("On Sale! %.1lf\n",a);
    }
    return 0;
}

剑指 Offer 16. 数值的整数次方

难度中等225收藏分享切换为英文接收动态反馈

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • -104 <= xn <= 104

注意:本题与主站 50 题相同:力扣

思路:快速幂,转化为二进制,正数取余为1;用a=1,a乘x,不为一,就x乘x,负数取余不为0,就a*x,否则x*x,返回1.0/a.

double myPow(double x, int n){

    double a=1;

    if(x==1)

    return 1;

    if(n>0)

    {

        while(n!=0)

        {

            if(n%2==1)

            a*=x;

            x*=x;

            n=n/2;

        }

        return a;

    }

    else if(n==0)

    return 1;

    else

    {

        while(n!=0)

        {

            if(n%2!=0)

            a*=x;

            x*=x;

            n=n/2;

        }

        return 1.0/a;

    }

}

L1-035 情人节 (15 分)

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

输入格式:

输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。

输出格式:

根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner...”;若只有A没有B,则输出“A is the only one for you...”;若连A都没有,则输出“Momo... No one is for you ...”。

输入样例1:

GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.

结尾无空行

输出样例1:

Magi and Potaty are inviting you to dinner...

结尾无空行

输入样例2:

LaoLao
FatMouse
whoever
.

输出样例2:

FatMouse is the only one for you...

输入样例3:

LaoLao
.

输出样例3:

Momo... No one is for you ...

 思路:定义数组进行存储,下标从1开始计数,判断i-1与2和14的关系,根据要求输出

#include <stdio.h>
int main()
{
    char a[1000][100];
    int i;
    for(i=1;;i++)
    {
        scanf("%s",a[i]);
        if(a[i][0]=='.')
            break;
        //printf("%s\n",a[i]);
    }
    i=i-1;
    if(i<2)
        printf("Momo... No one is for you ...");
    else if(i>=2&&i<14)
        printf("%s is the only one for you...",a[2]);
    else
        printf("%s and %s are inviting you to dinner...",a[2],a[14]);
    return 0;
}

L1-054 福到了 (15 分)

“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。

输入格式:

输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。

输出格式:

输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。

输入样例 1:

$ 9
 @  @@@@@
@@@  @@@ 
 @   @ @ 
@@@  @@@ 
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
 @  @ @ @
 @  @@@@@

结尾无空行

输出样例 1:

$$$$$  $ 
$ $ $  $ 
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
 $$$  $$$
 $ $   $ 
 $$$  $$$
$$$$$  $ 

结尾无空行

输入样例 2:

& 3
@@@
 @ 
@@@

结尾无空行

输出样例 2:

bu yong dao le
&&&
 & 
&&&

结尾无空行

思路:就是反向输出,在输出前进行判断反向后是否一致,按题输出。

#include <stdio.h>
int main()
{
    char a;
    int n,c=1;
    char b[500][500];
    scanf("%c %d",&a,&n);
    getchar();
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        scanf("%c",&b[i][j]);//输入
         //printf("%c",b[i][j]);}
    }
    getchar();
    for(int i=n-1;i>=0;i--)
        for(int j=n-1;j>=0;j--)
            if(b[i][j]!=b[n-1-i][n-1-j])//判断
                c=0;
    if(c)
        printf("bu yong dao le\n");
    for(int i=n-1;i>=0;i--)//反向输出
    {
        for(int j=n-1;j>=0;j--)
        {
            if(b[i][j]==' ')
                printf(" ");
            else
                printf("%c",a);
        }
        printf("\n");
    }
        
    return 0;
}

L1-068 调和平均 (10 分)

N 个正数的算数平均是这些数的和除以 N,它们的调和平均是它们倒数的算数平均的倒数。本题就请你计算给定的一系列正数的调和平均值。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (≤1000);第 2 行给出 N 个正数,都在区间 [0.1,100] 内。

输出格式:

在一行中输出给定数列的调和平均值,输出小数点后2位。

输入样例:

8
10 15 12.7 0.3 4 13 1 15.6

结尾无空行

输出样例:

1.61

结尾无空行

思路:按题目要求去计算就行。

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    double a[1010],sum=0;
    for(int i=0;i<n;i++)
    {
        scanf("%lf",&a[i]);
        sum+=1.0/a[i];
    }
    sum=sum/n*1.0;
    sum=1.0/sum;
    printf("%.2lf",sum);
    return 0;
}

7-18 二分法求多项式单根 (20 分)

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。

本题目要求编写程序,计算给定3阶多项式f(x)=a3​x3+a2​x2+a1​x+a0​在给定区间[a,b]内的根。

输入格式:

输入在第1行中顺序给出多项式的4个系数a3​、a2​、a1​、a0​,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:

在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:

3 -1 -3 1
-0.5 0.5

结尾无空行

输出样例:

0.33

结尾无空行

思路:根据题目要求,先进行区间判断加乘积判断,在进行计算

#include <stdio.h>
int main()
{
    double a3,a2,a1,a0,a,b;
    scanf("%lf%lf%lf%lf%lf%lf",&a3,&a2,&a1,&a0,&a,&b);
    //printf("%lf%lf%lf%lf%lf%lf",a3,a2,a1,a0,a,b);
    double x,y,k,l;
    x=a3*a*a*a+a2*a*a+a1*a+a0;
    y=a3*b*b*b+a2*b*b+a1*b+a0;
    k=(a+b)/2.0;
    
    //if(l==0)
        //{printf("%.2lf",k);return 0;}
    while((b-a)>=0.001&&x*y<=0)//判断部分
    {
        if(x==0)//端点为根
        {printf("%.2lf",a);return 0;}
        if(y==0)
        {printf("%.2lf",b);return 0;}
         l=a3*k*k*k+a2*k*k+a1*k+a0;
         if(l==0)//中点为根
         {
             printf("%.2lf",k);
             return 0;
         }
         if(l*x>0)
              a=k;
         if(l*y>0)
              b=k;
        x=a3*a*a*a+a2*a*a+a1*a+a0;
         y=a3*b*b*b+a2*b*b+a1*b+a0;
        k=(a+b)/2.0;
      }
        printf("%.2lf",(a+b)/2.0);
  return 0;
}

7-30 字符串的冒泡排序 (20 分)

我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。

输入格式:

输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。

输出格式:

输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。

输入样例:

6 2
best
cat
east
a
free
day

结尾无空行

输出样例:

best
a
cat
day
east
free

结尾无空行

思路:和数字的冒泡排序一致,就是要用到strcpy和strcmp。

#include <stdio.h>
#include <string.h>
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    char a[n][12],b[12];
    for(int i=0;i<n;i++)
        scanf("%s",a[i]);
    for(int i=0;i<m;i++)
        for(int j=0;j<n-1-i;j++)
            if(strcmp(a[j],a[j+1])>0)
            {
                strcpy(b,a[j]);
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],b);
            }
      for(int i=0;i<n;i++)
        printf("%s\n",a[i]);
    return 0;
}

7-32 说反话-加强版 (20 分)

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World   Here I Come

结尾无空行

输出样例:

Come I Here World Hello

结尾无空行

思路:就是将字符串存起来,从后往前判断,出现大写字母就顺序输出,最后一个要多输出一个空格,第一个单词单独考虑。从前往后计算空格个数,为0,就顺序输出,不为0,就从c位置顺序输出。

#include <stdio.h>
#include <string.h>
int main()
{
    char a[800090];
    gets(a);
    int b=strlen(a),c=0;
    if(a[0]==' ')
    {
        for(int i=0;i<b;i++)
    {
        if(a[i]==' ')
            c++;
        else
            break;
    }
    }
    for(int i=b-1;i>c;i--)
    {
        if(a[i]>='A'&&a[i]<='Z')
            for(int j=i;j<b+1;j++)
            {
                if(j==b&&a[j-1]!=' ')
                    {printf(" ");break;}
                if(a[j]!=' ')
                printf("%c",a[j]);
                else
                {printf(" ");break;}
            }
    }
    if(c==0)
    {
        for(int i=c;i<b;i++)
        {
            if(a[i]!=' ')
                printf("%c",a[i]);
            else
                return 0;
        }
    }
    for(int i=c;i<b;i++)
    {
        if(a[i]>='A'&&a[i]<='Z')
        {
            for(int j=i;j<b;j++)
            {
                if(a[j]!=' ')
            printf("%c",a[j]);
                else
            return 0;
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值