81 输出等腰杨辉三角
分数 10
作者 王跃萍单位 东北石油大学
输出6行等腰杨辉三角形。
输出格式:
第一行的1前面有13个空格;第2行的第一个1前面有11个空格,两个1之间有3个空格;最后一行的第一个1前面有3个空格。可以考虑每个数输出占4列列宽。
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include<stdio.h>
int main()
{
int arr[6][6] = { 0 };
for (int i = 0; i < 6; i++)
{
arr[i][0] = 1;
}
for (int i = 1; i < 6; i++)
{
for (int j = 1; j < 6; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < 6; i++)
{
for (int j = 5-i; j > 0; j--)
{
printf(" ");
}
for (int j = 0; j < i + 1; j++)
{
printf("%4d", arr[i][j]);
}
printf("\n");
}
return 0;
}
82 稳赢
分数 15
作者 陈越单位 浙江大学
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
![](https://img-blog.csdnimg.cn/img_convert/f70008aea289c6c82c44685a969463a2.jpeg)
现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。
输入格式:
输入首先在第一行给出正整数K(≤10),即平局间隔的次数。随后每行给出对方的一次出招:ChuiZi代表“锤子”、JianDao代表“剪刀”、Bu代表“布”。End代表输入结束,这一行不要作为出招处理。
输出格式:
对每一个输入的出招,按要求输出稳赢或平局的招式。每招占一行。
输入样例:
2
ChuiZi
JianDao
Bu
JianDao
Bu
ChuiZi
ChuiZi
End
输出样例:
Bu
ChuiZi
Bu
ChuiZi
JianDao
ChuiZi
Bu
#include<stdio.h>
int main()
{
int n,c=0;
char s1[3]={'B','u'},s2[7]={'C','h','u','i','Z','i'};
char s[15],s3[8]={'J','i','a','n','D','a','o'};
scanf("%d",&n);
while(scanf("%s",s))
{
if(s[0]=='C')//锤子
{
c++;//次数
if(c>n)//如果过了n次那就平局,也输出锤子。
{
printf("%s\n",s);
c=0;
}
else printf("%s\n",s1);//如果没有过n次,输出布。
}
else if(s[0]=='B')//下面和上面一样。
{
c++;
if(c>n)
{
printf("%s\n",s);
c=0;
}
else printf("%s\n",s3);
}
else if(s[0]=='J')
{
c++;
if(c>n)
{
printf("%s\n",s);
c=0;
}
else printf("%s\n",s2);
}
else if(s[0]=='E')break;
}
return 0;
}
83 画菱形
分数 10
作者 翁恺单位 浙江大学
菱形是一种特殊的平行四边形,是四条边均相等的平行四边形。题目给出菱形的边长n,用*画出菱形。如n=1,输出:
*
n=2,输出:
*
***
*
n=3,输出:
*
***
*****
***
*
那么,你能用程序来实现么?
输入格式:
输入菱形的边长n,1<n<100。
输出格式:
输出对应的用*表示的菱形。
输入样例:
4
输出样例:
*
***
*****
*******
*****
***
*
#include<stdio.h>
int main()
{
int n, i, j, k, m, temp;
scanf("%d",&n);
char a='*';
temp=n;
for(i=1;i<=n;i++)
{
for(j=1;j<temp;j++)
printf(" ");
temp--;
for(k=0;k<2*i-1;k++)
printf("%c",a);
printf("\n");
}
for(i=n-1;i>0;i--)
{
temp++;
for(j=1;j<=temp;j++)
printf(" ");
for(k=0;k<2*i-1;k++)
printf("%c",a);
printf("\n");
}
return 0;
}
84 小于m的最大的10个素数
分数 10
作者 王跃萍单位 东北石油大学
给定一个整数m(200<m<20000),找出小于m的最大的10个素数。
输入格式:
直接输入一个正整数m(200<m<20000)。没有其它任何附加字符。
输出格式:
在一行中输出10个满足条件的素数,每个素数输出占6列。没有其它任何附加格式和字符。
输入样例:
229
输出样例:
227 223 211 199 197 193 191 181 179 173
#include<stdio.h>
int main()
{
int m,k,cnt=0;
scanf("%d",&m);
for(int i=m-1;i>1;i--)
{
for(k=2;k<i;k++)
{
if(i%k==0)
break;
}
if(k>=i)
{
printf("%6d",i);// %6d和%06d都是占六位,如果不足六位
cnt++; //一个前面补充空格,一个补充0
}
if(cnt>=10)
break;
}
return 0;
}
85 方阵循环右移
分数 20
作者 颜晖单位 浙大城市学院
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
#include <stdio.h>
int main()
{
int a[6][6];
int m,n,i,j;
scanf("%d %d",&m,&n);
for (i=0; i<n; i++)
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
m%=n;
for (i=0; i<n; i++){
for (j=0; j<n; j++){
printf("%d ",a[i][(n-m+j)%n]);
}
printf("\n");
}
return 0;
}
86 杨辉三角
分数 10
作者 时贵英单位 东北石油大学
求杨辉三角的前n行数据。
输入格式:
输入n(n<10)值。
输出格式:
输出杨辉三角的前n行数据,每个数据占4列。
输入样例:
5
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
#include<stdio.h>
int main()
{
int n, i, j, arr[11][11]={0};
scanf("%d",&n);
for (int i = 0; i < n; i++)
{
arr[i][0] = 1;
}
for (int i = 1; i < n; i++)
{
for (int j = 1; j < n; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j <= i; j++)
printf("%4d",arr[i][j]);
printf("\n");
}
return 0;
}
87 阶梯电价
分数 15
作者 陈建海单位 浙江大学
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量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(){
float wt, cost;//wt:电量
scanf("%f", &wt);
if( wt < 0 ){
printf("Invalid Value!");
exit(0);
}
else if( wt <= 50 )
cost = wt * 0.53;
else
cost = (wt-50) * 0.58 + 0.53 * 50;
printf("cost = %.2f", cost);
return 0;
}
88 求一元二次方程的根
分数 20
作者 陈建海单位 浙江大学
本题目要求一元二次方程ax2+bx+c=0的根,结果保留2位小数。
输入格式:
输入在一行中给出3个浮点系数a、b、c,中间用空格分开。
输出格式:
根据系数情况,输出不同结果:
1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
3)如果方程只有一个根,则直接输出此根;
4)如果系数都为0,则输出"Zero Equation";
5)如果a和b为0,c不为0,则输出"Not An Equation"。
输入样例1:
2.1 8.9 3.5
输出样例1:
-0.44
-3.80
输入样例2:
1 2 3
输出样例2:
-1.00+1.41i
-1.00-1.41i
输入样例3:
0 2 4
输出样例3:
-2.00
输入样例4:
0 0 0
输出样例4:
Zero Equation
输入样例5:
0 0 1
输出样例5:
Not An Equation
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,t,x,y;
scanf("%lf %lf %lf",&a,&b,&c);
t=b*b-4*a*c;
if(a!=0 && t>0){
x=1.0*(-b+sqrt(t))/(2*a);
y=1.0*(-b-sqrt(t))/(2*a);
printf("%.2f\n",x);
printf("%.2f\n",y);
}else if(a!=0 && t==0){
x=(-b)/(2*a);
printf("%.2f",x);
}else if(a!=0 && t<0){
x=1.0*(-b)/(2*a);
y=1.0*sqrt(-t)/(2*a);
if( x!= 0){
printf("%.2f+%.2fi\n",x,y);
printf("%.2f-%.2fi\n",x,y);
}else{
printf("0.00+%.2fi\n",y);
printf("0.00-%.2fi\n",y);
}
}else if(a==0 && b==0 && c==0){
printf("Zero Equation");
}else if(a==0 && b==0 && c!=0){
printf("Not An Equation");
}else{
x=-1.0*(c/b);
printf("%.2f",x);
}
return 0;
}
89 回文数
分数 10
作者 王跃萍单位 东北石油大学
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。
输入格式:
直接输入一个5位数正整数。
输出格式:
输出“yes”或“no”。此处均为小写字母
输入样例:
12521
输出样例:
yes
输入样例:
65432
输出样例:
no
#include <stdio.h>
int main()
{
long a, b, c, d, x;
scanf("%ld", &x);
a = x / 10000; //分解出万位
b = x % 10000 / 1000; //分解出千位
c = x % 100 / 10; //分解出十位
d = x % 10; //分解出个位
//判断个位等于万位并且十位等于千位
if (a == d && b == c) {
printf("yes");
}
else {
printf("no");
}
}
90 求幂级数展开的部分和
分数 20
作者 C课程组单位 浙江大学
已知函数可以展开为幂级数1+x+x2/2!+x3/3!+⋯+xk/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求
的近似值,求和一直继续到最后一项的绝对值小于0.00001。
输入格式:
输入在一行中给出一个实数x∈[0,5]。
输出格式:
在一行中输出满足条件的幂级数部分和,保留小数点后四位。
输入样例:
1.2
输出样例:
3.3201
#include <stdio.h>
#include <math.h>
int main()
{
float x;
double k,sum = 1.0,sum1 = 1,part = 1;
scanf("%f",&x);
for(k = 1;fabs(part) > 0.00001;k++)
{
sum1 *= k;
part = pow(x,k) / sum1;
sum += part;
}
printf("%.4lf",sum);
}
91 兔子繁衍问题
分数 15
作者 徐镜春单位 浙江大学
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
#include <stdio.h>
int main()
{
//a(n)=a(n-1)+a(n-2)
int n,m=1,t=1,count=2;
int sum =1; //sum表示a(n)
scanf("%d",&n);
if(n==1){
printf("1");
}else{
while(sum<n){
count++;
t=m;
m=sum; //m在本轮循环中存放上一轮sum的值,留给下一轮赋值给t使用
sum+=t;
}
printf("%d\n",count);
}
return 0;
}
92 黑洞数
分数 20
作者 C课程组单位 浙江大学
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
输入格式:
输入在一行中给出一个三位数。
输出格式:
按照以下格式输出重排求差的过程:
序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。
输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
#include<stdio.h>
int main()
{
int a,b,c,d,e,f,n,i=0;
scanf("%d",&a);//输入一个三位数
do//由于至少运行一次,故用do while
{
b=a/100;d=a%10;
c=(a/10)%10;//将各位上数分开
while(b<c||c<d)//冒泡排序按由大到小的顺序排出
{
if(b>c) ;
else { n=b;b=c;c=n; }
if(c>d) ;
else{ n=c;c=d;d=n; }
}
i++;//运行的次数
e=b*100+c*10+d;
f=d*100+c*10+b;
a=e-f;//差值
printf("%d: %d - %d = %d\n",i,e,f,a);
}
while(a!=495&&a!=0);//判断条件
return 0;
}
93 a+aa+aaa+..
分数 10
作者 王跃萍单位 东北石油大学
求 Sn=a+aa+aaa+...+aa...a之值,其中a是一个数字。例如: 2+22+222+2222(此时n=4),n由键盘输入。
输入格式:
在一行中按照“a=x , n=y”格式顺序输入。其中x 、y均为正整数。
输出格式:
直接输出结果,没有任何附加字符。
输入样例:
a=2,n=4
输出样例:
2468
#include<stdio.h>
int main(){
int n,a,sum,term,i;
scanf("a=%d,n=%d",&a,&n);
term=a;
sum=0;
for(i=0;i<n;i++)
{
sum+=term;
term=term*10+a;
}
printf("%d\n",sum);
}
94 1/(1*2)+1/(2*3)+...误差
分数 10
作者 王跃萍单位 东北石油大学
求以下表达式的近似值,要求误差小于0.0001。
![](https://img-blog.csdnimg.cn/img_convert/f1652d5bf54f6c1192c9dce539451c1f.png)
输出格式:
直接输出保留6位小数的实型结果,没有其它任何附加字符。
输出样例:
0.990000
#include<stdio.h>
int main()
{
int i;
float n=1, sum=0;
for(i=1;i<100;i++)
{
sum+=1.0/(n*(n+1));
n++;
}
printf("%f",sum);
return 0;
}
95 验证手机号
分数 5
作者 贺细平单位 湖南农业大学
某系统在新用户注册时必须输入手机号,为了提高系统效率,防止输错手机号,需要对手机号进行验证。
验证规则为:
(1)长度为11位
(2)由数字0~9组成
(3)必须是1开头
以上3个条件同时满足,则验证通过,否则为不通过。
输入格式:
在一行中一个字符串,长度不超过20个字符。
输出格式:
如果验证通过则输出yes,否则输出no。
输入样例:
13812345678
输出样例:
yes
#include<stdio.h>
#include<string.h>
int main()
{
char temp[21];
scanf("%s",temp);
int len=strlen(temp),i,s=0;
if(temp[0]!='1'||len!=11) printf("no\n");
else
{
for(i=0;i<11;i++)
{
if(temp[i]>='0'&&temp[i]<='9') s++;//S记录循环次数
else break;
}
if(s==11) printf("yes\n");
else printf("no\n");
}
return 0;
}
96 查验身份证
分数 15
作者 陈越单位 浙江大学
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
#include<stdio.h>
int main()
{
int n,num=0,i,j;
scanf("%d",&n);
getchar();//用于读取n后面的换行符\n,防止后续被读取;
char s[100][20];
int a[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char str[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
//将对应关系转化为元素与下标之间的关系;
for(i=0;i<n;i++)
scanf("%s",s[i]);
for(i=0;i<n;i++)
{
for(j=0;j<17;j++)
if(s[i][j]-'0'<0||s[i][j]-'0'>9)//对前17位是否都是数字进行判断;
break;
if(j==17)
{
int z=0;
for(j=0;j<17;j++)
z+=(s[i][j]-'0')*a[j];
//自动转化类型,但是和z+=s[i][j]*a[j]意思不同;
z=z%11;//对11取模;根据示例是取余的意思,不是相除
if(str[z]!=s[i][17])
puts(s[i]);
else num++;
}
else puts(s[i]);
}
if(num==n) printf("All passed\n");
return 0;
}
97 计算存款利息
分数 10
作者 颜晖单位 浙大城市学院
本题目要求计算存款利息,计算公式为interest=money×(1+rate)year−money,其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。
输入格式:
输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。
输出格式:
在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。
输入样例:
1000 3 0.025
输出样例:
interest = 76.89
#include <stdio.h>
#include <math.h>
int main()
{
float m, y, r, i;
scanf("%f %f %f",&m,&y,&r);
i=m*pow(1+r,y)-m;
printf("interest = %.2f\n",i);
return 0;
}
98 鸡兔同笼
分数 10
作者 刘勇单位 重庆巴蜀常春藤学校
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。
输入格式:
输入两个整数n和m,分别表示鸡和兔的总数量和总腿数。(0<n<m<1000000)
输出格式:
输出两个整数,用一个空格隔开,分别表示鸡的只数和兔子的只数。
输入样例:
14 32
输出样例:
12 2
#include <stdio.h>
int main()
{
int chicken, rabbit, n, m;
scanf("%d", &n);
scanf ("%d", &m);
chicken = (4 * n - m) / 2;
rabbit = n - chicken;
if (m % 2 == 1 || chicken < 0 || rabbit < 0)
printf("No");
else
printf("%d %d\n", chicken, rabbit);
return 0;
}
99 小明的家庭合影
分数 10
作者 李祥单位 湖北经济学院
小明和爸爸、妈妈去青岛旅游,拍了很多照片。回家以后小明把有自己的照片全都放进了自己的相册中,然后从剩余照片中把有妈妈的照片都放进了妈妈的相册中,最后把剩下来的有爸爸的照片都放进了爸爸的相册中。
爸爸回来以后把小明和妈妈相册中有自己的 a 张照片取出来放进了自己的相册中。
妈妈回来以后又把小明和爸爸相册中有自己的 b 张照片取出来放进了自己的相册中。
请问:小明是和妈妈的合影多,还是和爸爸的合影多呢?
假设小明和妈妈的合影比和爸爸的合影多 c 张,请编写程序,求 c 的值。
输入格式
a、b
输出格式
c
提示:c 可能为正数、负数或零。
输入样例
(略)
输出样例
(略)
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=b-a;
printf("%d\n",c);
return 0;
}
100 汉诺塔
分数 30
作者 马倩单位 衡水学院
这是一个古典的数学问题,是一个只有用递归方法解决的问题。问题是这样的:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在上,小盘在下。在移动过程中可以利用C座。要求编程打印出移动的步骤。
![](https://img-blog.csdnimg.cn/img_convert/b4f2278fa7a0afc4e37b90f72bbf6871.png)
输入格式:
一个整数n,表示A座上原有的盘子个数。题目保证输入n在[1,64]之间。
输出格式:
打印输出形如“A->B”的多行字符串,每行表示一个移动盘子的操作。“A->B”表示在此步操作中将A座中最顶部的一个盘子移动到B座上。
输入样例:
3
输出样例:
在这里给出相应的输出。例如:
A->B
A->C
B->C
A->B
C->A
C->B
A->B
#include <stdio.h>
//定义move函数,将一个盘子从x座移到y座上
void move(char x, char y)
{
printf("%c->%c\n",x,y); //输出移盘方案。x,y代表A,B,C座之一,根据每次的不同情况分别取A,B,C代入
}
void hanoi(int n, char one, char two, char three) //将n个盘从one座借助three座,移到two座
{
if(n==1)
move(one, two);
else
{
hanoi(n-1, one, three, two); //将 A 座上 n-1 个盘子移到 C 座上(借助 B)
move(one, two);//将 A 座上剩下的 1 个盘子移到 C 座上
hanoi(n-1, three, two, one);//将 C 座上 n-1 个盘子移到 B 座上(借助 A)
}
}
main()
{
int m;
scanf("%d",&m); //盘子的数量
hanoi(m,'A','B','C');
}