目录
7-1 阶梯电价
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。
输出格式:
在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。
输入样例1:
10
输出样例1:
cost = 5.30
输入样例2:
100
输出样例2:
cost = 55.50
#include <stdio.h>
int main(){
int use;scanf("%d",&use);
double ans=0;
if(use<0) {
printf("Invalid Value!\n");
return 0;
}
else if(use<=50) {
ans=use*0.53;
}
else ans=50*0.53+(use-50)*(0.53+0.05);
printf("cost = %.2f",ans);
return 0;
}
7-2 求矩阵的最大值(设惟一)
本题要求编写程序,求一个给定的m×n矩阵的最大值以及位置。题目保证最大值惟一。
输入格式:
输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在第一行中输出最大值,在第二行中按照“行下标 列下标”(下标从0开始)的格式输出最大值的位置。
输入样例:
3 2
6 3
23 -9
6 -1
输出样例:
23
1 0
#include <stdio.h>
int a[9][9];
int main(){
int m,n;scanf("%d %d",&m,&n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) scanf("%d",&a[i][j]);
}
int max=a[0][0],row=0,col=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) {
if(a[i][j] > max) {
max=a[i][j];
row=i;
col=j;
}
}
}
printf("%d\n",max);
printf("%d %d",row,col);
return 0;
}
7-3 换硬币(鸡兔同笼)
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例:
13
输出样例:
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
#include <stdio.h>
int main()
{
int n;scanf("%d",&n);
int cnt=0;
for(int i_5=n/5;i_5>=1;i_5--){
for(int i_2=n/2;i_2>=1;i_2--){
int i_1=n-i_5*5-i_2*2;
int total=i_1+i_2+i_5;
if(i_1 > 0){
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i_5,i_2,i_1,total);
cnt++;
}
}
}
printf("count = %d",cnt);
return 0;
}
7-4 逆序输出一个整数的各位数字
本题要求编写程序,对输入的一个非负整数,从低位开始逐位分割并输出它的各位数字。
输入格式:
输入在一行中给出一个长整型范围内的非负整数。
输出格式:
从低位开始逐位输出该整数的各位数字,每个数字后面有一个空格。
输入样例:
1234560
输出样例:
0 6 5 4 3 2 1
#include <stdio.h>
void Print(long long x){
if(x==0) return; // 递归出口
printf("%lld ",x%10);
Print(x/10);// 递归
}
int main(){
long long x;scanf("%lld",&x);
if(x==0) {
printf("0 ");
}
else Print(x);
return 0;
}
7-5 交换最小值
本题要求编写程序,找出给定的N个数中的最小值,并将其与第一个数交换,最后输出交换后的序列。题目保证最小值是唯一的。
输入格式:
输入在第一行中给出一个正整数N(1≤n≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 8 4
#include <stdio.h>
int a[19];
int main(){
int n;scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int min=a[0],minIndex=0;
for(int i=1;i<n;i++){
if(a[i]<min) {
min=a[i];
minIndex=i;
}
}
int tmp=a[0];
a[0]=a[minIndex];
a[minIndex]=tmp;
for(int i=0;i<n;i++) printf("%d ",a[i]);
return 0;
}
7-6 分段函数2
计算分段函数,测试数据分别是-1、5、12。
输入格式:
输入一个数。
输出格式:
直接输出保留6位小数的结果,没有其它任何附加字符,没有宽度控制。
输入样例:
11
输出样例:
0.999912
输入样例:
7
输出样例:
8.000000
#include <stdio.h>
#include <math.h>
double F(int x){
if(x<0 && x!=-3)
return x;
else if(x>=0 && x<10 && x!=2 && x!=3)
return x+1;
else
return sin(3*x);
}
int main(){
int x;scanf("%d",&x);
double ans=F(x);
printf("%.6f",ans);
return 0;
}
7-7 数组中能被5整除的数的和
在一维数组中有10个整数,求出其中能被5整除的所有数的和。
输入格式:
在一行中输入10个整数,数据之间用1个空格间隔。
输出格式:
直接输出运算结果,没有任何附加字符。
输入样例:
5 6 8 15 98 45 71 2 3 1
输出样例:
65
#include <stdio.h>
int a[11];
int main(){
int ans=0;
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
if(a[i]%5==0) ans+=a[i];
}
printf("%d",ans);
return 0;
}
7-8 统计字母出现的次数(hash思想)
从键盘输入一行只有小写英文字母的字符串,用回车结束输入。统计26个英文字母出现的次数并依次输出。字符串长度不超过100个字符。
输入格式:
一行只有小写英文字母的字符串,用回车结束输入。
输出格式:
输出26行,按字典顺序输出26个小写英文字母和它们出现的次数。每个字母和它出现的次数占一行。字母和它出现的次数以一个空格隔开。
输入样例:
在这里给出一组输入。例如:
aaaaabbbcccdddeeffgghhhhijkllmnnopqrstuvwxyyyyzz
输出样例:
在这里给出相应的输出。例如:
a 5
b 3
c 3
d 3
e 2
f 2
g 2
h 4
i 1
j 1
k 1
l 2
m 1
n 2
o 1
p 1
q 1
r 1
s 1
t 1
u 1
v 1
w 1
x 1
y 4
z 2
#include <stdio.h>
#include <string.h>
typedef struct Hash{
char ch;
int value;
}H;
char s[101];
int main()
{
H h[29];
// fgets(s,sizeof(s),stdin);
scanf("%[^\n]",s);
// 初始化hash表
for(int i=0;i<26;i++){
h[i].ch='a'+i;
h[i].value=0;
}
for(int i=0;s[i]!='\0';i++)
h[s[i]-'a'].value++;
for(int i=0;i<26;i++)
printf("%c %d\n",h[i].ch,h[i].value);
return 0;
}
7-9 字母三角形
从键盘输入n,输出n行的如下图形
a
ab
abc
abcd
abcde
…
…
输入格式:
从键盘输入一个正整数n,输入数据保证不大于26。
输出格式:
如题所述的图形。注意输出的字母之间没有空格。
输入样例1:
5
输出样例1:
a
ab
abc
abcd
abcde
输入样例2:
8
输出样例2:
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
printf("%c",'a'+j);
}
printf("\n");
}
return 0;
}
7-10 简单求阶乘问题
本题要求编写程序,计算N的阶乘。
输入格式:
输入在一行中给出一个不超过12的正整数N。
输出格式:
在一行中输出阶乘的值。
输入样例:
4
输出样例:
24
#include <stdio.h>
int Fac(int x){
if(x==1) return 1;
return x*Fac(x-1);
}
int main(){
int n;scanf("%d",&n);
int ans=Fac(n);
printf("%d",ans);
return 0;
}
7-11 矩阵转置
从键盘输入一个m(2<=m<=6)*n(2<=n<=6)阶的矩阵,编程输出它的转置矩阵。
输入格式:
在第一行输入矩阵的行数m和列数n的值,在第二行按照矩阵格式输入矩阵的数据,同行数据之间用空格隔开。
输出格式:
矩阵格式输出,同行数据之间用一个空格隔开。
输入样例:
3 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
输出样例:
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
#include <stdio.h>
int a[9][9];
int main(){
// m行n列
int m,n;scanf("%d %d",&m,&n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) scanf("%d",&a[i][j]);
}
// n行m列
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(j==m-1)
printf("%d",a[j][i]);
else printf("%d ",a[j][i]);
}
printf("\n");
}
return 0;
}
7-12 输出所有大于平均值的数
本题要求编写程序,将输入的n个整数存入数组a中,然后计算这些数的平均值,再输出所有大于平均值的数。
输入格式:
输入在第1行中给出一个正整数n(1≤n≤10),第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。
输出格式:
输出在第1行给出平均值,保留2位小数。在第2行输出所有大于平均值的数,每个数的后面有一个空格;如果没有满足条件的数,则输出空行。
如果输入的n不在有效范围内,则在一行中输出"Invalid."。
输入样例1:
10
55 23 8 11 22 89 0 -1 78 186
输出样例1:
47.10
55 89 78 186
输入样例2:
0
输出样例2:
Invalid.
#include <stdio.h>
int a[11];
int main(){
int n;scanf("%d",&n);
if(n<1 || n>10){
printf("Invalid.");
return 0;
}
long long sum=0;double average=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
average=sum*1.0/n;
printf("%.2lf\n",average);
int flag=0;
for(int i=0;i<n;i++)
{
if(a[i] > average) {
printf("%d ",a[i]);
flag=1;
}
}
if(!flag) printf("\n");// 如果没有满足条件的数,则输出空行。
return 0;
}
7-13 输出前n个英文大写字母
从键盘输入一个正整数n(我们约定输入的数不大于26)。输出前n个大写英文字母。
输入格式:
一个正整数n(我们约定输入的数不大于26)。
输出格式:
前n个大写英文字母。
注意:输出的每个字母之间没有空格,行末没有换行。
输入样例1:
3
输出样例1:
ABC
输入样例2:
5
输出样例2:
ABCDE
#include <stdio.h>
int main()
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++) printf("%c",'A'+i);
return 0;
}
7-14 删除字符串中指定字符(字符串读取)
删除字符串中的指定字符,字符串和要删除的字符均由键盘输入。
输入格式:
在第一行中输入一个长度不超过20的字符串、并以回车结束;在第二行中输入待删除的一个字符,并以回车结束。
输出格式:
在一行中输出删完指定字符的字符串。
输入样例:
abcdcf
c
输出样例:
abdf
#include <stdio.h>
char s[29],ch;
int main()
{
// 1.
// fgets(s,sizeof(s),stdin);
// scanf("%c",&ch);
//2.
// gets(s);
// scanf("%c",&ch);
// 3.
scanf("%[^\n]",s);
scanf(" %c",&ch);
for(int i=0;s[i]!='\0';i++) {
if(s[i]!=ch)
printf("%c",s[i]);
}
return 0;
}
使用fgets、gets读取字符串后,再读取其他数据,不需要使用getchar()读取缓冲区上的换行符;
使用scanf读取字符串后,再读取其他数据,读取时需要跳过缓冲区上的换行符;
7-15 特殊a串数列求和
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
#include <stdio.h>
int main()
{
int a,n;scanf("%d %d",&a,&n);
int ans=0,num=a;
while(n--){
ans+=num;
num=num*10+a;
}
printf("s = %d",ans);
return 0;
}
7-16 分段函数求值
编写程序,根据从键盘输入的x的值,输出y的值。x和y都是双精度浮点数,输出精确到小数点后3位。x与y的函数关系如下图所示:
输入格式:
输入是一个双精度浮点数。
输出格式:
输出是一个双精度浮点数,要求精确到小数点后3位。
输入样例:
在这里给出一组输入。例如:
3.1
输出样例:
在这里给出相应的输出。例如:
34.791
#include <stdio.h>
int main(){
double x,y;
scanf("%lf",&x);
if(x < 0)
y=x*x+9;
else
y=x*x*x+5;
printf("%.3f",y);
return 0;
}
7-17 二维数组处理(一)
输入整型二维数组a(5行5列),完成如下要求:
输出二维数组a。
将a的第2行和第4行元素对调后,形成新的二维数组a并按行输出,每个元素之间隔一个空格。(行号从0开始计算)。
用对角线(指二维数组左上角到右下角的对角线)上的元素分别去除相应行的各元素,形成一个新的双精度型二维数组b并输出,每个输出占8列,输出到小数点后3位。
输入格式:
一个5行5列的整型二维数组
输出格式:
题目要求的各个输出
输入样例:
10 20 30 40 50
8 9 7 5 3
1 2 3 5 9
3 5 6 2 4
3 5 2 1 0
输出样例:
10 20 30 40 50
8 9 7 5 3
1 2 3 5 9
3 5 6 2 4
3 5 2 1 0
10 20 30 40 50
8 9 7 5 3
3 5 2 1 0
3 5 6 2 4
1 2 3 5 9
1.000 2.000 3.000 4.000 5.000
0.889 1.000 0.778 0.556 0.333
1.500 2.500 1.000 0.500 0.000
1.500 2.500 3.000 1.000 2.000
0.111 0.222 0.333 0.556 1.000
#include <stdio.h>
void print(int a[][6],int x,int y){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++) printf("%d ",a[i][j]);
printf("\n");
}
}
int a[6][6];
double ans[6][6];
int main()
{
for(int i=0;i<5;i++){
for(int j=0;j<5;j++) scanf("%d",&a[i][j]);
}
print(a,5,5);
// 遍历第二行交换
int p=2;
for(int i=0;i<5;i++){
int tmp=a[p][i];
a[p][i]=a[p+2][i];
a[p+2][i]=tmp;
}
print(a,5,5);
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
ans[i][j]=a[i][j]*1.0/a[i][i];
}
}
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
printf("%8.3f",ans[i][j]);
}
printf("\n");
}
return 0;
}
7-18 数字金字塔(打印图形)
从键盘输入一个正整数n,输出n行的数字金字塔。输入保证 1 <= n <= 9。
输入格式:
从键盘输入一个正整数n,输入保证 1 <= n <= 9。
输出格式:
输出n行的数字金字塔。每个数字之间没有空格。
输入样例1:
5
输出样例1:
1
121
12321
1234321
123454321
输入样例2:
7
输出样例2:
1
121
12321
1234321
123454321
12345654321
1234567654321
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){// 行
for(int k=0;k<n-i;k++) printf(" ");
for(int j=1;j<=i;j++) printf("%d",j);
for(int j=i-1;j>=1;j--) printf("%d",j);
printf("\n");
}
return 0;
}
7-19 二维数组处理(二)
从键盘输入6行6列的双精度型二维数组。
(1)按行输出二维数组每个元素的值。
(2)将上三角形每个元素的值加1,下三角形每个元素的值减1,对角线元素不变。按行输出二维数组每个元素的值。
(3)求变化后数组的最大值,按输出示例输出最大值的行列号和最大值。输出格式如下:
The max is a[最大值的行下标][最大值的列下标] = 最大值
(4)用数组每个元素除以最大值,得到新的数组并输出。
输出格式要求:输出的每个浮点数占5列,输出到小数点后2位,右对齐。
输入格式:
双精度二维数组a(6行6列)
输出格式:
按题目要求输出
输入样例:
1 3 5 6 9 3
8 9 7 5 3 3
1 2 3 5 9 7
3 5 6 2 4 6
3 5 2 1 0 5
8 9 5 4 3 1
输出样例:
1.00 3.00 5.00 6.00 9.00 3.00
8.00 9.00 7.00 5.00 3.00 3.00
1.00 2.00 3.00 5.00 9.00 7.00
3.00 5.00 6.00 2.00 4.00 6.00
3.00 5.00 2.00 1.00 0.00 5.00
8.00 9.00 5.00 4.00 3.00 1.00
1.00 4.00 6.00 7.0010.00 4.00
7.00 9.00 8.00 6.00 4.00 4.00
0.00 1.00 3.00 6.0010.00 8.00
2.00 4.00 5.00 2.00 5.00 7.00
2.00 4.00 1.00 0.00 0.00 6.00
7.00 8.00 4.00 3.00 2.00 1.00
The max is a[0][4] = 10.00
0.10 0.40 0.60 0.70 1.00 0.40
0.70 0.90 0.80 0.60 0.40 0.40
0.00 0.10 0.30 0.60 1.00 0.80
0.20 0.40 0.50 0.20 0.50 0.70
0.20 0.40 0.10 0.00 0.00 0.60
0.70 0.80 0.40 0.30 0.20 0.10
#include <stdio.h>
void print(double a[][6]) {
for(int i=0;i<6;i++) {
for(int j=0;j<6;j++) printf("%5.2f",a[i][j]);
printf("\n");
}
}
double a[6][6];
int main()
{
for(int i=0;i<6;i++) {
for(int j=0;j<6;j++) scanf("%lf",&a[i][j]);
}
print(a);
//
for(int i=0;i<6;i++) {
for(int j=0;j<6;j++){
if(i<j) a[i][j]+=1;
if(i>j) a[i][j]-=1;
}
}
print(a);
double max=a[0][0];
int x_Index=0,y_Index=0;
for(int i=0;i<6;i++) {
for(int j=0;j<6;j++){
if(a[i][j] > max){
max=a[i][j];
x_Index=i;
y_Index=j;
}
}
}
printf("The max is a[%d][%d] = %.2f\n",x_Index,y_Index,max);
for(int i=0;i<6;i++) {
for(int j=0;j<6;j++){
a[i][j]/=max;
}
}
print(a);
return 0;
}
7-20 字符转换
本题要求提取一个字符串中的所有数字字符(‘0’……‘9’),将其转换为一个整数输出。
输入格式:
输入在一行中给出一个不超过80个字符且以回车结束的字符串。
输出格式:
在一行中输出转换后的整数。题目保证输出不超过长整型范围。
输入样例:
free82jeep5
输出样例:
825
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main()
{
char s[89];
gets(s);
int ans=0;
for(int i=0;s[i]!='\0';i++) {
if(isdigit(s[i])) ans=ans*10+s[i]-'0';
}
printf("%d",ans);
return 0;
}