这部分题由于过于简单,属于白送题目,因此把所有特别简单题的合集于此。
1048:统计某人12个月的银行帐户余额的平均数。(简单的令人汗!)
/*ZOJ 1048: 统计小数的平均数!居然就是12个double求平均数。。汗!*/
#include <stdio.h>
double balance[12];
int main()
{
int i;
double sum=0,aver;
for(i=0;i<12;i++)
{
scanf("%lf", &balance[i]);
sum+=balance[i];
}
aver=sum/12;
printf("$%.2lf", aver);
}
1070:简单交流电路,求电阻上的电压降落。纯属解数学方程。
/*1070 ZOJ*/
#include <stdio.h>
#include <math.h>
void main()
{
double vs,vr,r,c,w;
int n,i;
while(scanf("%lf %lf %lf %d", &vs,&r,&c, &n)!=EOF && n>0)
{
for(i=0;i<n;i++)
{
scanf("%lf",&w);
vr=w*c*vs/sqrt(w*w+1);
printf("%.3lf\n", vr);
}
}
}
1049:某人买地,给出一点坐标,流失土地以半圆形扩张,每年增加50平方英里面积。问多少年后某点消失。
/*ZOL 1049 - I Think I Need a Houseboat. */
#include <math.h>
#include <stdio.h>
/*0.01 PI*/
#define PI_PERCENT 0.03141592653589793
int main()
{
int i,n,years;
double x,y;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf %lf",&x,&y);
years=(int)((x*x+y*y)*PI_PERCENT)+1;
printf("Property %d: This property will begin eroding in year %d.\n", i, years);
}
printf("END OF OUTPUT.");
return 0;
}
1078:求一个数字用2,3,...,16进制表示时是否是“回文数”,例如12321。
/*1078 - Palindrom Numbers (回文数字)*/
#include <string.h>
#include <stdio.h>
/*判断一个数字n在以base为进制时是否是回文数字*/
int IsPalindrom(unsigned int n, unsigned int base)
{
int i=0,j;
char buffer[20],*s;
memset(buffer,0,sizeof(buffer));
while(n)
{
buffer[i++]=n%base;
n/=base;
}
/*现在i就是strlen(buffer),判断是否回文数*/
s=buffer;
for(j=0;j<i/2;j++)
if(buffer[j]!=buffer[i-1-j])
return 0;
/*说明是回文数*/
return 1;
}
int main()
{
unsigned int n, base;
char text[64];
while(scanf("%d",&n)!=EOF && n>0)
{
memset(text,0,sizeof(text));
for(base=2;base<=16;base++)
{
if(IsPalindrom(n, base))
sprintf(text+strlen(text)," %d",base);
}
if(strlen(text)>0)
printf("Number %u is palindrom in basis%s\n", n, text);
else
printf("Number %u is not a palindrom\n", n);
}
return 0;
}
1099:简单的HTML解析。仅包含<br>,<hr>标记。每行80字符。
/*ZOJ 1099 - HTML */
#include <stdio.h>
#include <string.h>
int main()
{
int i,length=0;/*当前行的长度*/
char word[81];
while(scanf("%s", word)!=EOF)
{
if(strcmp(word, "<br>")==0)
{
printf("\n");
length=0;
}
else if(strcmp(word, "<hr>")==0)
{
if(length>0) printf("\n");
for(i=0;i<80;i++) printf("-");
printf("\n");
length=0;
}
else if(length+strlen(word)+1 >80)
{
/*需要换行*/
printf("\n%s", word);
length=strlen(word);
}
else
{
/*无需要换行*/
if(length>0)
{
printf(" ");
length++;
}
printf("%s", word);
length += strlen(word);
}
}
return 0;
}
1180:要求求出100w以内的所有Self Number。所谓SelfNumber,即不存在任何数字n,使n+digitsum(n)=m成立,则m称为SelfNumber。这题我写的很“暴力”,开了100w字节空间,并且要计算100w次才能得出结果。运行时间长达50ms。
/*ZOJ 1180 - Self Numbers */
#include <stdio.h>
#define N 1000001
char flag[N]; /*如果i是self Number,则flag[i]=0*/
unsigned long d(unsigned long n)
{
unsigned long result=n;
while(n)
{
result+=n%10;
n/=10;
}
return result;
}
void InitFlags()
{
unsigned long i,j;
for(i=1;i<N;i++)
{
j=d(i);
flag[j]=1;
}
}
int main()
{
unsigned long i;
InitFlags();
for(i=1;i<N;i++)
if(flag[i]==0)
printf("%u\n",i);
return 0;
}
1241:给出直角三角形的三条边a,b,c其中的两个,求另外一个。
/*1241 - Geometry Made Simple 很简单的题*/
#include <math.h>
#include <stdio.h>
int main()
{
int a,b,c,count=1;
while(1)
{
scanf("%d %d %d", &a, &b, &c);
if(a==0 && b==0 && c==0) break;
printf("Triangle #%d\n", count++);
if(c==-1)
printf("c = %.3f\n", sqrt(a*a+b*b));
else if(a==-1)
{
if(c<=b) printf("Impossible.\n");
else printf("a = %.3f\n", sqrt(c*c-b*b));
}
else if(b==-1)
{
if(c<=a) printf("Impossible.\n");
else printf("b = %.3f\n", sqrt(c*c-a*a));
}
printf("\n");
}
}
1242:用C14衰减法测量生物年代。生物体存活时,C14含量为810 d/(克*小时),死亡后该值每5730年衰减至原来的一半。现在给出生物体样本重量,C14含量,求出生物生活年代。对于10000年以下的,四舍五入到100年整数倍,对于10000年以上的,四舍五入到1000年整数倍。
假设当前含量为 a d/(克*小时),年代为t,则有方程:t/5370=log2(810/a);
因此有:t=5370*log2(810/a);
库函数中只有自然对数和10为底对数,可根据对数性质:log2(x)=log(x)/log(2);
四舍五入可以根据(加0.5然后取整)法。
#include <math.h>
#include <stdio.h>
int main()
{
int x1,x2,n=1;
unsigned long result;
double years;
while(scanf("%d %d",&x1,&x2)!=EOF)
{
if(x1==0 && x2==0) break;
//log2(x)=log(x)/log(2), log是自然对数,以e为底
years = log(810.0/x2*x1)*5730/log(2);
if(years<10000)
{
//四舍五入到100整数倍
result = ((unsigned long)((years+50)/100))*100;
}
else
{
//四舍五入到1000整数倍
result = ((unsigned long)((years+500)/1000))*1000;
}
printf("Sample #%d\n", n++);
printf("The approximate age is %lu years.\n\n", result);
}
return 0;
}
1243:URL字符串解析。提取出协议,主机地址,端口号,服务器路径。
/*ZOJ 1243 - URLs*/
#include <string.h>
#include <stdio.h>
/*读取URL的缓冲区*/
char line[64];
int main()
{
int n, i, j, hoststart;
char *s,c;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s", line);
printf("URL #%d\n", i);
/*<protocol> is always one of http, ftp, gopher*/
switch(line[0])
{
case 'h': hoststart=7; printf("Protocol = http\n");break;
case 'f': hoststart=6; printf("Protocol = ftp\n");break;
case 'g': hoststart=9; printf("Protocol = gopher\n");break;
}
/*<host> 由字母/数字,点组成 */
printf("Host = "); /*acm.baylor.edu*/
for(j=hoststart; line[j]!=':' && line[j]!='/' && line[j]; j++) printf("%c", line[j]);
printf("\n");
/*[Port]*/
printf("Port = ");
if(line[j]==':')
{
for(j=j+1; line[j]!='/' && line[j]; j++) printf("%c", line[j]);
printf("\n");
}
else
printf("<default>\n");
/*Path,如果line[j]为斜杠则说明有Path*/
printf("Path = ");
if(line[j]=='/')
{
for(j=j+1; line[j]; j++) printf("%c", line[j]);
printf("\n");
}
else
printf("<default>\n");
/*blank line after each test cas.*/
printf("\n");
}
return 0;
}
1334:一个计算器,把某进制数转换成另一个进制。
/* ZOJ 1334 - Basically Speaking */
/* 一个计算器,把某进制数转换成另一个进制 */
#include <stdio.h>
#include <string.h>
char numbers[]="0123456789ABCDEF";
/*把输入字符串,以进制转换到dest */
void Convert(unsigned long n, char *dest, int base)
{
int index=6;
strcpy(dest, " ");
while(n)
{
if(index<0)
{
strcpy(dest," ERROR");/*注意右对齐!因此前面补齐2个空格!*/
return;
}
dest[index--]=numbers[n%base];
n/=base;
}
}
/*把输入的字符串(某进制)转换为一个整数*/
unsigned long GetNumber(char *src, int base)
{
unsigned long n=0, k=1;
int i;
for(i=strlen(src)-1; i>=0; i--)
{
n+=(strchr(numbers, src[i]) - numbers )*k;
k*=base;
}
return n;
}
int main()
{
char buffer[100], result[8];
unsigned long n;
int base1,base2;
while(scanf("%s %d %d", buffer,&base1,&base2)!=EOF)
{
n=GetNumber(buffer, base1);
Convert(n, result, base2);
printf("%s\n", result);
}
return 0;
}
1760:输入一序列数字(以0表示结束),输出这些数字中有多少个二倍关系。
/*ZOJ 1760 - Doubles*/
/*寻找一个输入序列(2~15个整数)中有多少二倍关系*/
#include <stdio.h>
int n[16]; /*存储序列数字*/
int count; /*该List中含有多少个数字*/
int main()
{
int i,j,result;
while(1)
{
scanf("%d",&n[0]);
if(n[0]==-1) break; /*检查第一个数字是不是-1,表示结束输入*/
count=1;
for(count=1;count<16 && n[count-1]!=0; count++)
scanf("%d", &n[count]);
/*统计二倍的个数*/
result=0;
for(i=0;i<count-1;i++)
for(j=i+1;j<count;j++)
if((n[i]==n[j]*2)||(n[j]==n[i]*2))
result++;
printf("%d\n",result);
}
return 0;
}
1763:好像是求取一些连续输入的温度的差值。
#include <stdio.h>
int main()
{
double t1=0,t2=0;
scanf("%lf",&t1);
while(scanf("%lf",&t2)!=EOF && ((int)t2) < 999)
{
printf("%.2lf\n",t2-t1);
t1=t2;
}
printf("End of Output\n");
}
2001:给出两个数字,颠倒数位后想加,结果再颠倒数位。例如输入24 1,则42+1=43, 输出34;
/* ZOJ 2002 - Adding Reversed Numbers */
#include <stdio.h>
int GetInverseNum(int n)
{
int r=0;
while(n)
{
r=r*10+(n%10);
n/=10;
}
return r;
}
int main()
{
int count,i,n1,n2,sum;
scanf("%d", &count);
for(i=0;i<count;i++)
{
scanf("%d %d", &n1,&n2);
n1=GetInverseNum(n1);
n2=GetInverseNum(n2);
sum=GetInverseNum(n1+n2);
printf("%d\n",sum);
}
return 0;
}
2987:给出n组输入,每个输入包含一个数字m(以1为base),和一个单词,打印出该单词去掉第m个字母的结果。
/* ZOJ 2987 - Misspelling */
#include <stdio.h>
#include <string.h>
char line[84];
int main()
{
int n, m, i, j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
/*m是以1为base的,表示要删除第几个字符*/
scanf("%d %s",&m, line);
printf("%d ", i);/*打印序号*/
/*注意不要打印索引为m-1的字符即可!*/
for(j=0;j<m-1;j++) printf("%c", line[j]);
for(j=m;j<strlen(line);j++) printf("%c", line[j]);
printf("\n");
}
return 0;
}
( TO BE CONTINUED... ) --hoodlum1980