05-0. 求序列前N项和(15)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


张彤彧(浙江大学)



本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后2位。题目保证计算结果不超过双精度范围。

输入样例:

20

输出样例:

32.66

程序:

#include<stdio.h>
#include<stdlib.h>
int main()
{
int N;
while(scanf("%d",&N)==1)
{
double a=2,b=1;
double sum=0.0;
for(int i=1;i<=N;i++)
{
sum+=a*1.0/b;
a=a+b;
b=a-b;
}
printf("%.2lf\n",sum);
}
}


05-1. 约分最简分式(15)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


翁恺(浙江大学)



分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如: ​​12/34​​ 表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:在scanf的格式字符串中加入“/”,让scanf来处理这个斜杠。

输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如 ​​5/6​​表示6分之5。

输入样例:

60/120

输出样例:

1/2

代码:

#include<stdio.h>
#include<stdlib.h>
int Div(int n,int m)
{
if(n<m)
{
int temp=n;
n=m;
m=temp;
}
int rem=n%m;
while(rem)
{
n=m;
m=rem;
rem=n%m;
}
return m;
}
int main()
{
int n,m;
char c;
while(scanf("%d%c%d",&n,&c,&m)==3)
{
int div=Div(n,m);
printf("%d/%d\n",n/div,m/div);
}
}


05-2. 念数字(15)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


翁恺(浙江大学)



输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu



输入格式:

输入在一行中给出一个整数,如: ​​1234​​ 。

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 ​​yi er san si​​。

输入样例:

-600

输出样例:

fu liu ling ling

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char num[10][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main()
{
int n;
while(scanf("%d",&n)==1)
{
int flag=0;
if(n<0)
{
printf("fu");
n=-n;
flag=1;
}
char a[100];
sprintf(a,"%d",n);
for(int i=0;i<strlen(a);i++)
{
if(flag==1)
{
printf(" %s",num[a[i]-48]);
}
if(flag==0)
{
flag=1;
printf("%s",num[a[i]-48]);
}
}
printf("\n");
}
}


05-3. 求a的连续和(15)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


翁恺(浙江大学)



输入两个整数a和n,a的范围是[0,9],n的范围是[1,8],求数列之和S = a+aa+aaa+...+aaa...a(n个a)。 如a为2、n为8时输出的是2+22+222+...+22222222的和。

输入格式:

输入在一行中给出两个整数,先后表示a和n。

输出格式:

在一行中输出要求的数列之和。

输入样例:

2 4

输出样例:

2468

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a,n;
while(scanf("%d%d",&a,&n)==2)
{
int i,d=a*n,temp=0;
int arr[100];
for(i=0;i<n;i++)
{
d=a*(n-i)+temp;
arr[i]=d%10;
temp=d/10;
}
long long sum=0,pro=1;
for(i=0;i<n;i++)
{
sum+=arr[i]*pro;
pro*=10;
}
if(temp!=0)
printf("%d",temp);
printf("%lld\n",sum);
}
return 0;
}


06-0. 混合类型数据格式化输入(5)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


乔林(清华大学)



本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:

2.12 88 c 4.7

输出样例:

c 88 2.12 4.70

代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
double d1,d2;
int i;
char c,c1,c2;
while(scanf("%lf%d%c%c%c%lf",&d1,&i,&c1,&c,&c2,&d2)==6)
{
printf("%c %d %.2lf %.2lf\n",c,i,d1,d2);
}
return 0;
}


06-1. 简单计算器(20)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


张彤彧(浙江大学)



模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10


代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a[10000];
char b[10000];
int i,num,c,cnt1=0,cnt2=0,flag=1;
do
{
scanf("%d%c",&num,&c);
a[cnt1++]=num;
b[cnt2++]=c;
}while(c!='=');
int res=a[0],j=0;
for(i=1;i<cnt1;i++)
{
j=i-1;
if(b[j]!='+'&&b[j]!='-'&&b[j]!='*'&&b[j]!='/')
{
flag=0;
break;
}
if(b[j]=='*')
{
res*=a[i];
}
else if(b[j]=='-')
{
res-=a[i];
}
else if(b[j]=='/')
{
if(a[i]==0)
{
flag=0;
break;
}
res/=a[i];
}
else if(b[j]=='+')
{
res+=a[i];
}
}
if(flag==0)
printf("ERROR\n");
else
printf("%d\n",res);
}



06-2. 字符串字母大小写转换(10)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


张彤彧(浙江大学)



输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。

输入格式:

输入在一行中给出一个长度不超过40的、以#结束的非空字符串。

输出格式:

在一行中按照要求输出转换后的字符串。

输入样例:

Hello World! 123#

输出样例:

hELLO wORLD! 123

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a[100];
char ch;
int cnt=0,i;
do
{
scanf("%c",&ch);
a[cnt++]=ch;
}while(ch!='#');
for(i=0;i<cnt-1;i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
a[i]=a[i]+32;
continue;
}
if(a[i]>='a'&&a[i]<='z')
{
a[i]=a[i]-32;
continue;
}
}
for(i=0;i<cnt-1;i++)
printf("%c",a[i]);
printf("\n");
}



06-3. 单词长度(15)




时间限制


400 ms



内存限制


65536 kB



代码长度限制


8000 B



判题程序


Standard


作者


翁恺(浙江大学)



你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格;最后的‘.’不计算在内。

输入格式:

输入在一行中给出一行文本,以‘.’结束。

提示:用scanf("%c",...);来读入一个字符,直到读到‘.’为止。

输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:

It's great to see you here.


输出样例:

4 5 2 3 3 4

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a[100000];
char ch;
int cnt=0,i,j;
scanf("%c",&ch);
while(ch!='.')
{
a[cnt++]=ch;
scanf("%c",&ch);
}
int len=strlen(a);
int lea[1000],t=0;
for(i=0;i<len;i++)
{
if(a[i]!=' ')
{
j=i+1;
while(a[j]!=' '&&j<len)
{
j++;
}
lea[t++]=j-i;
i=j;
}
}
for(i=0;i<t;i++)
{
if(i==0)
printf("%d",lea[0]);
else
printf(" %d",lea[i]);
}
printf("\n");
}