杭电oj2029c语言答案,杭电OJ之2020-2029(C语言版)

2020. 绝对值排序

题目

Problem Description

输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。

Input

输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。

Output

对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。

Sample Input

3 3 -4 2

4 0 1 2 -3

0

Sample Output

-4 3 2

-3 2 1 0

代码

#include

#include

int a[120];

int main()

{

int n;

while(scanf("%d", &n) != EOF)

{

if(n == 0) break;

for(int i=0;i < n; i++)

{

scanf("%d", &a[i]);

}

//冒泡排序

for(int i=0; i < n-1; i++)

for(int j=0; j < n-i-1; j++)

{

if(abs(a[j]) < abs(a[j+1]))

{

int temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

//打印a[i]

for(int i = 0; i < n; i++)

{

if(i == n-1) {printf("%d\n", a[i]); break;}

printf("%d ", a[i]);

}

}

return 0;

}

思路与总结

重点:排序算法

冒泡排序

关键代码如下:

//冒泡排序

for(int i=0; i < n-1; i++)

for(int j=0; j < n-i-1; j++)

{

if(abs(a[j]) < abs(a[j+1]))

//绝对值按从大到小排列,每次冒泡最小的(即把最小的放在最后)

{

int temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

2021. 发工资咯

题目

Problem Description

财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?

这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。

Input

输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。

n=0表示输入的结束,不做处理。

Output

对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。

Sample Input

3

1 2 3

0

Sample Output

4

代码

#include

int main()

{

int i,j,n,t,k,s[6]={100,50,10,5,2,1};

while(~scanf("%d",&n),n) //逗号表达式

{

for(i=j=k=0;i

{

scanf("%d",&t);

while(t)

{

if(t

else t-=s[j],k++;

}

}

printf("%d\n",k);

}

return 0;

}

思路与总结

逗号表达式

(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14

2020.

题目

Problem Description

输入一个字符串,判断其是否是C的合法标识符。

Input

输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。

Output

对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。

Sample Input

3

12ajf

fi8x_a

ff ai_2

Sample Output

no

yes

no

代码

#include

#include

int main(void)

{

int n;

scanf("%d", &n);

getchar();

while (n--) {

char c, flag = 1;

c = getchar();

if (!(isalpha(c) || c == '_'))

flag = 0;

while ((c = getchar()) != '\n') {

if (!(isalnum(c) || c == '_'))

flag = 0;

}

printf("%s\n", flag ? "yes" : "no");

}

return 0;

}

思路与总结

按照字符流来处理,好好消化!

标识符输入结束判断语句:c = getchar()) != '\n'

2025. 查找最大元素

题目

Problem Description

对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。

Input

输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。

Output

对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果,如果存在多个最大的字母,就在每一个最大字母后面都插入"(max)"。

Sample Input

abcdefgfedcba

xxxxx

Sample Output

abcdefg(max)fedcba

x(max)x(max)x(max)x(max)x(max)

代码

#include

#include

int main()

{

char max,str[101];

int len,i;

while(~scanf("%s",str))

{

len=strlen(str);

max='a';

for(i=0;i<=len-1;i++)

{

if(str[i]>max)

{

max=str[i];

}

}

for(i=0;i<=len-1;i++)

{

printf("%c",str[i]);

if(str[i]==max)

{

printf("(max)");

}

}

printf("\n");

}

return 0;

}

思路与总结

1. 找到最大字母

2. 在最大字母后,输出(Max)

2026. 首字母便大写

题目

Problem Description

输入一个英文句子,将每个单词的第一个字母改成大写字母。

Input

输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。

Output

请输出按照要求改写后的英文句子。

Sample Input

i like acm

i want to get an accepted

Sample Output

I Like Acm

I Want To Get An Accepted

代码

#include

#include

#include

int main()

{

char a[105];

int i,len;

while(gets(a)!='\0')

{

len=strlen(a);

if(a[0]!=' ')

a[0]=a[0]-32;

for(i=1;i

{

if(a[i]!=' '&&a[i-1]==' ')

{

a[i]=a[i]-32;

}

}

puts(a);

}

return 0;

}

思路与总结

改变空格后的字母为大写,注意第一个

语法知识

gets:

gets能够接受空格、制表符Tab和回车等;

gets可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中

puts:

puts()在输出字符串时会将’\0’自动转换成’\n’进行输出,也就是说,puts方法输出完字符串后会自动换行。

2027. 统计元音

题目

Problem Description

统计每个元音字母在字符串中出现的次数。

Input

输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串。

Output

对于每个测试实例输出5行,格式如下:

a:num1

e:num2

i:num3

o:num4

u:num5

多个测试实例之间由一个空行隔开。

请特别注意:最后一块输出后面没有空行:)

Sample Input

2

aeiou

my name is ignatius

Sample Output

a:1

e:1

i:1

o:1

u:1

a:2

e:1

i:3

o:0

u:1

代码

# include

# include

int main()

{

int n, len;

char s[150];

while(scanf("%d", &n) != EOF && n != 0)

{

getchar();

while(n--)

{

gets(s);

int a_count = 0;int e_count = 0;int i_count = 0;int o_count = 0;int u_count = 0;

len = strlen(s);

for(int i=0;i < len; i++)

{

if(s[i] == 'a') a_count += 1;

if(s[i] == 'e') e_count += 1;

if(s[i] == 'i') i_count += 1;

if(s[i] == 'o') o_count += 1;

if(s[i] == 'u') u_count += 1;

}

printf("a:%d\n", a_count);

printf("e:%d\n", e_count);

printf("i:%d\n", i_count);

printf("o:%d\n", o_count);

printf("u:%d\n", u_count);

if(n) printf("\n");

}

}

return 0;

}

思路与总结

在做字符类型题目,注意scanf会引入一个'\n'换行符,必要时用getchar()吸收。

2028. Lowest Common Multiple Plus(最小公倍数)

题目

Problem Description

求n个数的最小公倍数。

Input

输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。

Output

为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。

Sample Input

2 4 6

3 2 5 7

Sample Output

12

70

代码

//最小公倍数 = 两整数 / 最大公约数

#include

int gcd(int a,int b)

{

return b==0?a:gcd(b,a%b);

}

int lcm(int a,int b)

{

return a*b/gcd(a,b);

}

int main()

{

int a[100],n;

while(scanf("%d",&n)==1)

{

int i,y=1;

for(i=0;i

scanf("%d",&a[i]);

//转换成两个比较,比较n-1轮

for(i=0;i

{

a[i+1]=lcm(a[i],a[i+1]);

}

printf("%d\n",a[i]);

}

return 0;

}

思路与总结

//最小公倍数 = 两整数 / 最大公约数

最大公约数(辗转相除法)--递归 重点

int gcd(int a,int b)

{

return b==0?a:gcd(b,a%b);

}

2020. Palindromes _easy version(回文串)

题目

Problem Description

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。

Input

输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。

Output

如果一个字符串是回文串,则输出"yes",否则输出"no".

Sample Input

4

level

abcde

noon

haha

Sample Output

yes

no

yes

no

代码

/* HDU2029 Palindromes _easy version */

#include

#include

int main(void)

{

int n, flag, start, end;

char a[4096];

scanf("%d", &n);

while(n--) {

// 读入字符串

scanf("%s", a);

// 判断是否为回文

start = 0;

end = strlen(a) - 1;

flag = 1;

while(start < end) {

if(a[end] != a[start]) {

flag = 0;

break;

}

start++;

end--;

}

// 输出结果

if(flag)

printf("yes\n");

else

printf("no\n");

}

return 0;

}

思路与总结

判断回文,按照题意来就行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值