L1-027 出租 (20 分)
下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index
数组就是arr
数组的下标,index[0]=2
对应 arr[2]=1
,index[1]=0
对应 arr[0]=8
,index[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;
}
难度中等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)=a3x3+a2x2+a1x+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;
}