课程设计报告
01 水仙花数
题目:指一个三位数,它的各位数字的立方和等于其本身,比如:153=1*1*1+5*5*5+3*3*3
输入2个整数m,n,求2个整数之间的水仙花数,有则输出,无则输出no。
思路:
令i从m到n变化,若满足题意则输出,不满足则输出no.
细节:
多组数据要加上while((----)!=EOF)
循环输出时加一个判断的变量
代码:
#include<stdio.h>
#include<math.h>
int main()
{int n,i,m,k=0;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=n;i<=m;i++)
{
if(pow(i/100,3)+pow((i/10)%10,3)+pow(i%10,3)==i)
{
k++;
if(k==1)
{printf("%d",i);}
else
{ printf(" %d",i);}
}}
if(k==0)
{
printf("no");
}
printf("\n");
k=0;
}
return 0;
}
输入
100 120
300 380
输出
no
370 371
02 判断素数
题目
输入两个整数m,n,对于(m,n)中的整数i,若(i*i+i+41)为素数,则输出"OK",否则输出“Sorry”,每组输出占一行。当m=0,n=0时,输入结束。
思路:
先构造一个函数判断是否是素数,然后写判断对i是否是素数的循环,按题意输出。
细节:
输入结束用if(m==0&&n==0) break;
先写一个函数判断素数。
代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int s(int x)
{
int i;
if(x<2)
return 0;
for(i=2;i*i<=x;i++)
{
if(x%i==0)
return 0;
}
return 1;
}
int main()
{
int a,n,m,i,k;
while(scanf("%d %d",&m,&n)!=EOF)
{
int l;
if(m==0&&n==0)
break;
else
{
for(i=m;i<=n;i++)
{l=i*i+i+41;
if(!s(l))
{
printf("Sorry\n");
break;
} }
if(i==n+1)
{printf("OK\n");}
}
}
}
输入
0 1
0 0
输出
OK
03 多项式的前n项的和
题目:输入数据一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数,求该多项式的前n项的和。输出占一行,结果保留2位小数。
Ps 多项的和:1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
思路:
(1)判断是否是负数,是则加负号
(2)然后循环计算和
细节:
循环最后加上初始变量s=0
代码:
#include<stdio.h>
#include<math.h>
main()
{
int a,i,b,j;
double s=0;
while(scanf("%d",&a)!=EOF)
for(i=1;i<=a;i++)
{
scanf("%d",&b);
for(j=1;j<=b;j++)
{
if(j%2==1)
{
s=s+1.0/j;
}
else
{
s=-1*1.0/j+s;
}
}
printf("%.2lf\n",s);
s=0;
}
}输入
2
1 2
输出
1.00
0.50
04 求平均值
题目:
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。输出该平均值序列。
输入多组数据,每组占一行,包含两个正整数n和m,
对于每组输入数据,输出一个平均值序列,每组输出占一行.
思路:
(1)先把这个数列求出来(2)先输出第一个平均值,再输出第二个
细节:
(1)第一个平均值后加上空格
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int m,i,n,j,p,q;
while(scanf("%d %d",&n,&m)!=EOF)
{
j=0;
p=0;
for(int i=1;i<=n;i++)
{
j= j+ 2*i ;
p++;
if(p==m&&i!=n)
{
printf("%d ",j/m);
p=0;
j=0;
}
}
printf("%d",j/p);
printf("\n");
}
return 0;
}
输入
3 2
4 2
输出
3 6
3 7
05 求比赛的平均分
题目:输入多组数据,每组一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个打分。去掉一个最高分和一个最低分后,输出平均分,结果保留2位小数,每组输出占一行。
思路:
先用冒泡法排序
之后求第二项到第n-1项的和
输出(和除以n-2)的值
细节:
结果保留两位小数
代码:
#include<stdio.h>
int main()
{
int a[101],b,i,t,n,j;
double s;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=1,s=0;i<n-1;i++)
{
s=s+a[i];
}
printf("%.2f\n",s/(n-2));
}
return 0;
}
输入
3 99 98 97
4 100 99 98 97
输出
98.00
98.50
06 计算母牛的数量
题目:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年开始,每年年初也生一头小母牛,计算第n年的时候,共有多少头母牛。n=0表示输入数据的结束,不做处理
思路:找规律
年份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
母牛数量 | 1 | 2 | 3 | 4 | a | b | c | d |
a:原先的4个+每年生的1头+第一年的小母牛生的1头=前一个+前第3个
b: 原先的6个+每年生的1头+第二年的小母牛生的2头
c:原先的9个+每年生的1头+第三年的小母牛生的3头
d:原先的13个+每年生的1头+第四年的小母牛生的4头
综上:第n年=第n-1个+第n-3个
细节:
输入到0结束
代码:
#include<stdio.h>
#include<math.h>
int a[60];
int main()
{
int n;
a[1] = 1;
a[2] = 2;
a[3] = 3;
a[4] = 4;
for(int i=5;i <= 60;i++)
a[i] = a[i-1] + a[i-3];
while(scanf("%d",&n) && n != 0){
printf("%d\n",a[n]);
}
return 0;
}
输入
2
4
5
0
输出
2
4
6
07 取绝对值后排序
题目:
输入多组数据,每组占一行,每行的第一个数字为n,接着是n个整数,按照绝对值从大到小排序后输出,直到输入n=0结束。
思路:
用冒泡法对取abs的数组排序,然后输出排序后的数组
细节:
Abs函数表示取绝对值,头文件是#include<stdlib.h>
注意:输出时若均输出 "%d ",b[i] 时易PE,因为最后一个数后面不能加空格。
所以要把最后一项单独拿出来。
代码:
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
int main()
{
int a,i,j,t;
while (scanf("%d",&a)!=EOF)
{
if(a==0)
break;
int b[a];
i=0;
while (i<a)
scanf("%d",&b[i++]);
for(i=0;i<a;i++)
for (j=0;j<a-i-1;j++)
{
if (abs(b[j])<abs(b[j+1]))
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
for(i=0;i<a-1;i++)
{printf("%d ",b[i]);
}
printf("%d",b[a-1]);
printf("\n");
}
return 0;
}
输入
3 3 -4 2
4 0 1 2 -3
0
输出
-4 3 2
-3 2 1 0
08 回文串
题目:输入多组数据,第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串,判断字符串是否是“回文”。 是则输出"yes",否则输出"no".
Ps: “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”
思路:
从左到右和从右到左同时开始比较
即 第1项和第n项比较,第2项和第n-1项比较,----
细节:
输入字符串时是gets(s)
代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void)
{
int n,m,l,i,j;
char s[100];
while(scanf("%d",&n)!=EOF)
{
getchar();
while(n--)
{
gets(s);
l=strlen(s);//表示字符串的长度
i=0;
j=l-1;
while(i<j)
{
if(s[i]!=s[j])
break;
i++;
j--;
}
if(i>=j)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
}
输入
4
level
abcde
noon
haha
输出
yes
no
yes
no
09 A的B次方
题目:输入多组数据,每个数据占一行,由两个正整数A和B组成(1<=A,B<=10000),输出A的B次方的最后三位表示的整数,每个输出占一行。直到输入A=0, B=0为止
思路:
用一个循环重复乘A
细节:
(1)容易数据溢出,故从大的开始,每次减1
代码:
#include<stdio.h>
#include<math.h>
main()
{
int n,m,i;
long long int b,k;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
else if(m==0)
printf("1\n");
k=1;
while(m--)//即细节(1)
{
k=k*n;
k=k%1000;
}
printf("%d\n",k);
}
return 0;
}
输入
2 3
12 6
6789 10000
0 0
输出
8
984
1
10 进制转换
题目:输入多组数据,每个数据包含两个整数N(32位十进制整数)和R(2<=R<=16, R<>10)。将十进制数N,将它转换成R进制数输出。
Ps: 如果R大于10,则对应的数字规则参考16进制(比如,10用A表示)
思路:
(1)先判断是否是负数,是则取反
(2)构造一个循环,让其转换为R进制,余数储存在数组中
例 十进制的27转化为四进制是123,即27%4==3,27/4%4==2,7/4/4%4==1,而7/4/4/4==0循环结束。
(3)若结果〉=10,则转化为字母。
细节:
输出数组时从最后一项开始输出。
代码:
#include<stdio.h>
int main()
{
int m,n,i;
while(scanf("%d %d",&m,&n)!=EOF)
{
if(m<0)
{
printf("-");
m=-m;
}
if(n==0)
{printf("0\n");
continue;}
int c=0,a[100];
while(m)
{
a[c]=(m%n);
c++;
m/=n;
}
for(i=c-1;i>=0;i--)
{
if(a[i]>=10)
{printf("%c",'A'+a[i]-10);}
else
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
输入
7 2
23 12
-4 3
输出
111
1B
-11
11 上楼梯
题目:
输入一个整N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数,开始时在第一级,每次只能跨一级或二级,要走上M级,输出不同走法的数量。
思路:找规律,从第一级开始
台阶级数 | 2 | 3 | 4 | 5 | 6 | 7 |
走法的数量 | 1 | 2 | 3 | 5 | 8 | 13 |
所以a[n]=a[n-1]+a[n-2]
细节:
要注意是从第一级开始。
代码:
#include<stdio.h>
int main()
{
int i,N,M,a[50];
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&M);
a[2]=1;
a[3]=2;
for(int j=4;j<=M;j++)
{a[j]=a[j-1]+a[j-2];}
printf("%d\n",a[M]);}
return 0;
}
输入
2
2
3
输出
1
2
12 解方程求A1
题目:
有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).
输入多组数据。每个数据首先是正整数n(n <= 3000);,然后是2个数a0, an+1.接下来的n行每行有一个数ci(i = 1, ....n);输入以文件结束符结束,输出a1(保留2位小数).
思路:
解方程,解得关于A1,A0,A(n+1),Ci(i = 1, 2, 3, .... n)的方程
A1 = (n*A0+An-2*sum)/(n+1)
细节:
定义A0,A(n+1)是double类型
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int maxn=3000+10;
double c[maxn];
int main()
{
int n;
double A0,An;
while(scanf("%d",&n)!=EOF)
{
scanf("%lf%lf",&A0,&An);
double sum=0.0;
for(int i=1;i<=n;i++)
{
scanf("%lf",&c[i]);
sum+=(n-i+1)*c[i];
}
double A1 = (n*A0+An-2*sum)/(n+1);
printf("%.2lf\n",A1);
}
return 0;
}
输入
1
50.00
25.00
10.00
2
50.00
25.00
10.00
20.00
输出
27.50
15.00
13 统计个数
题目:
输入的都是整数对n、m(0<n≤m<1000000),对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
Ps: 不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
思路:
将1~1000000区间内的所有含有4或连续的62的数的个数记录下来(累加),输入定义区间n,m,将总车牌号个数减去区间内存在含有4或连续的62的数的个数后输出。
细节:区间内车牌号总数是m-n+1。
代码:
#include<stdio.h>
#include<string.h>
int luck(int x)
{
while(x)
{
if(x%10==4||x%100==62)
{
return 0;
}
x/=10;
}
return 1;
}
int x[1000005];
int main()
{
int i,n,m,s;
for(i=1;i<1000005;i++)
{
x[i]=x[i-1]+luck(i);
}
while(scanf("%d%d",&n,&m)&&(n||m))
{
printf("%d\n",x[m]-x[n-1]);
}
return 0;}
输入
1 100
0 0
输出
80
14 求整数的末两位
题目:一个整数,只知道前几位,不知道末二位,被另一个整数除尽了。
输入数据有若干组,每组数据包含二个整数a,b(0<a<10000, 10<b<100),求末两位
若遇到0 0则输入结束。将满足条件的所有尾数在一行内输出,同组数据的输出,其每个尾数之间空一格,行末没有空格。
思路:
先判断末两位是否是个位数,是则加一个0。
构造一个循环,满足条件则输出
细节:
注意题目中对空格的要求。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)&&a||b)
{
a=a*100;
int k=0;
for(int i=0;i<=99;i++)
{
if((a+i)%b==0)
{
k++;
if(k==1)
{if(i<10)
{ printf("0");
printf("%d",i);}
else
printf("%d",i);
}
else
{if(i<10)
{printf(" 0");
printf("%d",i);}
else
printf(" %d",i);
}
}
}
printf("\n");
}
return 0;
}
输入:
200 40
1992 95
0 0
输出:
00 40 80
15
15字符三角形
题目:
输入一个字符和一个整数n(0<n<41),不同的字符表示不同的花纹,整数n表示等腰三角形的高。其底边长为2n-1。若输入@字符,则结束。 输出一个掏空的字符三角形。
每个样板三角形之间应空上一行,三角形的中间为空。显然行末没有多余的空格。
思路:
(1)先观察规律,行+列=n+1或行-列=n-1时输出字符,否则输出空格
细节:
注意题目中对空格的要求
输入字符时要特殊处理
代码:
#include <stdio.h>
#include <string.h>
int main()
{
char a;
int b,i,j,k=0;
while(scanf("%c",&a)&&a!='@')
{
++k;
getchar();//读取空格;细节(2)
scanf("%d",&b);
getchar();//这一句不能省,否则会在第二次输入时a直接变成\n(换行符)!
if(k!=1),
printf("\n");//只有在判断过第二个结果满足条件后,才输出空行,
//此空行依然在第二个结果之前,满足两个空三角形之间有空行的条件!
for(i=1;i<b;i++)
{
for(j=1;j<=b+(i-1);j++)
{
if(j==b-(i-1)||j==b+(i-1))
printf("%c",a);
else
printf(" ");
}
printf("\n");
}
for(i=0;i<2*b-1;i++)
printf("%c",a);
printf("\n");
}
return 0;
}
输入:
X 2
A 7
@
输出:
X
XXX
A
A A
A A
A A
A A
A A
AAAAAAAAAAAAA
总结
学习c语言已经一个学期了,这一个学期从什么都不懂的小白到现在能熟练写出程序解决实际问题,中间经历了不少磨难坎坷,顺序、分支、循环、数组、字符……正如攀登高山般一步一个台阶,一步比一步艰难,然而,当自己独自编完一个程序并通过时,那种喜悦是无法用其他东西代替的。
c语言编程严谨,一个符号都不能放过。??
尽管学习了半年,懂得越多,越觉得它博大精深。编程对于自己的专业和以后的工作都有大帮助,不能放下它,何况还有明年的计算机二级考试, ???
加油吧,少年!未来的路长着呢!