c语言试题(水仙花数==)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Description
某外国销售公司需要向国内的一些大型单位打电话推销产品。这个公司的工作场景是这样推销员坐在自己电脑旁边,通过一款自动拨电话的
软件与客户联系。所有需要被拨打的电话号码都事先存储在服务器上,推销员不需要每次都很麻烦的输入客户的电话号码,当推销员点击软件里
拨打的按钮,下一个电话将会自动拨出。
现在你需要编写个程序来模拟这个自动拨电话软件的工作过程。电话号码是按照中国的习惯存储下来的,可能是从网站上抓取的,也可能
是扫描的手写件。不过它们都被按照这样的格式存储下来:
(城市区号)分区前缀-分机号
比如青岛的一个大型单位的某部电话是(0532)621-15486,是指如果在单位内部直接拨打15486就行,在青岛的其他地方要拨打62115486,而
在北京要拨打0532********。根据常识,先拨0就是要转外线,所以一般电话号码的各个部分都不会以0开头。
你的程序可以把如上格式的电话号码翻译成一个只包含有数字的串,发送给电话机并拨出。值得注意的是中国的城市区号长度并不相同,
比如北京是010。再有不同城市的电话号码位数也不相同,并且不同单位根据内部电话分机数目多少,有的可能只有3位分机号码,有的可能
分区前缀号会只有2位。但不管怎样中国现在还没有哪个城市的电话号码超过十位数的。中国的国际区号是0086。
这里不含像114这样的特服电话。
Input
输入只有一行,是符合“(城市区号)分区前缀-分机号”规律的电话号码,这里面除了英文字符“(”、“)”、“-”之外只有数字。
Output
输出只有一行,是带中国区号的能电话号码。注意从国外打国内的电话,城市区号前面的0是不用拨打的。比如中国青岛的国际分区号是0086532。
Sample Input
(0532)621-15486
Sample Output
008653262115486
HINT
这是个可以用scanf()解决的问题,请注意电话号码都是数字这个规律。
****************************************************************************************
Description
给定一个n,求出s = 1+2+3+...+n的值。
Input
输入只有一行,包含一个正整数n(n<=232)。
Output
输出一行,为1+2+...+n的值。
Sample Input
10
Sample Output
55
HINT
n的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。
****************************************************************************************
Description
从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。
Input
一个非负有理数x,x在[0,2256]范围内。
Output
一个整数y。
Sample Input
1
Sample Output
0
HINT
看起来数据很大,但是用double完全可以存储。为什
么?请研究下IEEE-754标准的浮点数存储格式。这里要用到C语言标准库的数学函数。
****************************************************************************************
Description
读取两行字符串,按每行的长度从长到短输出。
Input
输入为两行,每行不会超过26个字符。
Output
输出为两行,按每行的长度从长到短输出。
Sample Input
abcdefghijk
abcdefghijklmnopqrstuvwxyz
Sample Output
abcdefghijklmnopqrstuvwxyz
abcdefghijk
HINT
了解字符串的存储和操作,了解gets()和scanf("%s")读入字符串的不同之处。
****************************************************************************************
Description
输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n
Input
输入三个整数,依次为k、m、 n。
Output
从小到大输出符合题意的所有整数,两数之间用一个空格分开。
Sample Input
15 2 3
Sample Output
2 3 4 8 9 10 14 15
HINT
难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。
****************************************************************************************
Description
找出n个数中最大的数和最小的数,并将它们的值输出出来。
Input
输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。
输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。
Output
输出为两行,格式见sample。
Sample Input
3 0 1 -1
Sample Output
The maximum number is 1.
The minimum number is -1.
HINT
分隔符是空格还是回车都是空白符,对scanf("%d")来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。
*****************************************************************************************
Description
把百分制的考试成绩转换成五级制的成绩:
90~100:Excellent
80~89:Good
70~79:Average
60~69:Pass
0~59:Failing
不在0~100之间的输入是非法数据,输出“Error”。
Input
输入多行,每行一个整数。
Output
输入所对应的成绩等级。
Sample Input
-1
81
92
35
68
72
100
Sample Output
Error
Good
Excellent
Failing
Pass
Average
Excellent
HINT
用switch语句解决这个问题比较方便。
*****************************************************************************************
Description
编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。
Input
每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存
在除数为0的情况。
输入以a和b为0,且用一个空格分开结束。
Output
每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。
Sample Input
33+5
8*9
2.2
1-6
17/3
9%3
0 0
Sample Output
38
72
invalid op
-5
5
0
HINT
教材上有非常相似的例题可以参考。
****************************************************************************************
Description
素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。
Input
输入为两个整数m和n,满足0<=m<=n<=100。
Output
从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。
输出的所有数在两行“=====”之间。
Sample Input
2 12
Sample Output
=====
11
7
5
3
2
=====
HINT
利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。
****************************************************************************************
Description
已知华氏温度F,转换为摄氏温度C的公式为C=(F-32)*5/9。
输出给定范围(从low到high)和步长(step)的摄氏——华氏温度转换表
Input
第1行若为“C->F”表示输出:摄氏——华氏温度转换表,若为“F->C”表示输出:华氏——摄氏温度转换表。
第2、3行为两个整数:high和low,其值在-100到200之间。
第4行为step,step精确到小数点后1位。
Output
输出第一行为C和F,分别表示摄氏和华氏,与小数点对齐。若输出摄氏——华氏温度转换表,则C在前、F在后;反之,则输出华氏——摄氏
温度转换表。
从输出的第2行开始为从温度low到温度high(包括low和high)的转换表,温度输出精确到小数点后1位,表格被“->”分为两个宽度相同的
部分,其它的测试样例也不会给出超出宽度的数据,格式详见sample。
Sample Input
C->F
-10
40
2.5
Sample Output
C -> F
-10.0 -> 14.0
-7.5 -> 18.5
-5.0 -> 23.0
-2.5 -> 27.5
0.0 -> 32.0
2.5 -> 36.5
5.0 -> 41.0
7.5 -> 45.5
10.0 -> 50.0
12.5 -> 54.5
15.0 -> 59.0
17.5 -> 63.5
20.0 -> 68.0
22.5 -> 72.5
25.0 -> 77.0
27.5 -> 81.5
30.0 -> 86.0
32.5 -> 90.5
35.0 -> 95.0
37.5 -> 99.5
40.0 -> 104.0
HINT
输出格式可以通过sample分析出来,因为两栏的总宽度是固定的。一个隐藏的陷阱是step是浮点数,某些浮点数是无法精确存储的,
因此经过一定量的计算后这个误差会影响到浮点数的相等性判断,需要加上精度控制。
******************************************************************************************
Description
求1!+2!+…+k!=?,并判断是否溢出。
Input
输入为一个正整数k。
Output
若1!+2!+
…+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+…+k!的结果。
Sample Input
5
Sample Output
153
HINT
如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?
****************************************************************************************
1、Problem A: 水仙花数
#include
int main()
{
int n,b,c,d;
scanf("%d",&n);
b=n/100;
c=n/10%10;
d=n%10;
if((b*b*b+c*c*c+d*d*d)==n)
printf("YES");
else
printf("NO");
return 0;
}
2、Problem B: 多少张钞票
#include
int main()
{
int x,a,b,c,d;
scanf("%d",&x);
a=(100-x)/20;
b=(100-x)%20/10;
c=(100-x)%20%10/5;
d=(100-x)%20%10%5;
printf("$20 bills: %d\n",a);
printf("$10 bills: %d\n",b);
printf(" $5 bills: %d\n",c);
printf(" $1 bills: %d",d);
return 0;
}
3、Problem C: 自动拨出电话的程序
#include
int main()
{
int a,b,c;
scanf("(%d)%d-%d",&a,&b,&c);
printf("0086%d%d%d",a,b,c);
return 0;
}
4、Problem D: 求1+2+...+n=?
#include
int main()
{
unsigned long long n,sum;
scanf("%llu",&n);
sum=(n+n*(n-1)/2);
printf("%llu",sum);
return 0;
}
5、Problem E: 2的多少次幂
#include
#include
int main()
{
double x;
scanf("%lf",&x);
printf("%.0lf",log(x)/log(2));
return 0;
}
6、Problem F: 哪一行比较长
#include
int main()
{
char str1[27],str2[27],n,m;
gets(str1);
gets(str2);
m=0;
while(str1[m]!='\0')
m++;
n=0;
while(str2[n]!='\0')
n++;
if(m>n)
{
puts(str1);
puts(str2);
}
else
{
puts(str2);
puts(str1);
}
return 0;
}
7、Problem G: 三个数比较大小
#include
int main()
{
int a,b,c,t;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
t=b;
b=a;
a=t;
}
if(b>c)
{
t=c;
c=b;
b=t;
}
if(a>b)
{
t=b;
b=a;
a=t;
}
printf("%d %d %d",a,b,c);
return 0;
}
8、Problem H: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
#include
int main()
{
int m,n,k,i;
scanf("%d%d%d",&k,&m,&n);
for(i=1; i<=k; i++)
if((i%m==0&&i%n!=0)||(i%m!=0&&i%n==0))
printf("%d ",i);
printf("\b");
return 0;
}
9、Problem I: A+B Problem
#include
int main()
{
int m,n,sum;
while(scanf("%d %d",&m,&n)!=EOF)
{
sum=m+n;
printf("%d\n",sum);
}
return 0;
}
10、A+B Problem (II) : Input/Output Pratice
#include
int main()
{
int i,n;
scanf("%d",&n);
int a[n];
int b[n];
for(i=0; i
for(i=0; i<
n; i++)
{
printf("%d\n",a[i]+b[i]);
}
return 0;
}
11、Problem K: A+B Problem (III) : Input/Output Pratice
#include
int main()
{
int i,m;
int a[50];
int b[50];
for(i=0;; i++)
{
scanf("%d %d",&a[i],&b[i]);
if(a[i]==0&&b[i]==0)
break;
}
for(m=0; mprintf("%d\n",a[m]+b[m]);
return 0;
}
12、Problem L: A+B Problem (IV) : Input/Output Pratice
#include
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
printf("%d\n\n",a+b);
}
13、Problem M: n个数的最大值和最小值
#include
int main()
{
int n,i,max,min;
scanf("%d",&n);
int a[n];
for(i=0; i
max=a[0];
min=a[0];
for(i=0; i
if(maxmax=a[i];
if(min>a[i])
min=a[i];
}
printf("The maximum number is %d.\n",max);
printf("The minimum number is %d.",min);
return 0;
}
14、Problem N: 成绩的等级
#include
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<=100&&n>=0)
{
switch(n/10)
{
case 10:
case 9:
printf("Excellent");
break;
case 8:
printf("Good");
break;
case 7:
printf("Average");
break;
case 6:
printf("Pass");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("Failing");
break;
}
}
else
printf("Error");
printf("\n");
}
return 0;
}
15、Problem O: 只有一个二元运算符的表达式运算
#include
int main()
{
int a,b;
char c;
scanf("%d%c%d",&a,&c,&b);
for(;;)
{
if(c=='+')
printf("%d\n",a+b);
else if(c=='-')
printf("%d\n",a-b);
else if(c=='*')
printf("%d\n",a*b);
else if(c=='/')
printf("%d\n",a/b);
else if(c=='%')
printf("%d\n",a%b);
else if((c==' ')&&(a==0)&&(b==0))
break;
else
printf("invalid op\n");
scanf("%d%c%d",&a,&c,&b);
}
return 0;
}
16、Problem P: 求100以内的素数
#include
int main()
{
int i,m,n;
scanf("%d%d",&m,&n);
printf("=====\n");
for(i=n; i>=m; i--)
{
if(i%2!=0&&i%3!=0&&i%5!=0&&i%7!=0&&i!=1)
printf("%d\n",i);
if(i==2||i==3||i==5||i==7)
printf("%d\n",i);
}
printf("=====\n");
return 0;
}
17、Problem Q: 摄氏——华氏温度转换表
#include
int main()
{
char a[4];
int i;
float c,s,l,h,f;
for (i=0; i<4; i++)
scanf("%c",&a[i]);
scanf("%f%f%f",&l,&h,&s);
if (a[0]=='C'&&a[1]=='-'&&a[2]=='>'&&a[3]=='F')
{
printf(" C -> F\n");
while(l<=h)
{
f=((float)9/5)*l+32;
printf("%5.1f -> %5.1f\n",l,f);
l = l + s;
}
}
else if(a[0]=='F'&&a[1]=='-'&&a[2]=='>'&&a[3]=='C')
{
printf(" F -> C\n");
while(l<=h)
{
c=(l-32)*((float)5/9);
printf("%5.1f -> %5.1f\n",l,c);
l = l + s;
}
}
return 0;
}
18、Problem R: 1!+2!+…+k!=?
#include
int main()
{
unsigned int n,m=1,i,j,sum=0;
scanf("%u",&n);
for(i=1; i<=n; i++)
{
m=1;
for(j=1; j<=i; j++)
m=m*j;
sum+=m;
}
if(sum<=65535)
printf("%u",sum);
else
printf("overflow");
return 0;
}