第一组
1
第21题
题目概括:
求6+手机号码后五位。
输入数据的第一行是一个N(表示有N个数据),接下来的N行每一行为一个11位的手机号码。输出应包括N行,每行包括一个对应的短号,保证顺序一致。
代码
#include<stdio.h>
int main()
{
long long int a,i,b,n=0;
scanf("%lld",&a);
for(i=1;i<=a;i++)
{
scanf("%lld",&b);
n=600000+b%100000;
printf("%d\n",n);
}
return 0;
}
解析:令b为手机号码,令a为数字的上限。
总结:其实这道题并不难,但是就是好几次都不对。当一个一个试的时候即b%10;b%100……
后来才发现是格式错误,应该用longlongint
一开始只用了int。
2
第24题
题目概括:
帮妈妈求每天买菜的菜价,即为数量乘单价相加。输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数)。在支付的时候采用四舍五入的方法把分头去掉。
代码:
#include <stdio.h>
int main()
{
double n, p, sum;
while (~scanf("%*s%lf%lf", &n, &p))
sum += n * p;
printf("%.1lf\n", sum);
return 0;
}
解析:
令n,p,分别为菜的数量和单价。因为n,p的值都是可变的,即不断改变n,p的值,所以用while输入。最后在相乘并求和。
总结:
这道题解题思路并不难,主要难点在于菜名字符串的输入与定义。
3
第23题
题目概括:
对于每次给出的一个牌照区间号,去掉带有4和62的车牌号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
代码:
#include<stdio.h>
int main()
{
int n,m,i,j=0,a;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
{
break;
}
for(i=n;i<=m;i++)
{
j++;
for(a=i;a>=1;a=a/10)
{
if(a%10==4)
{
j--;
break;
}
if(a%100==62)
{
j--;
break;
}
}
}
printf("%d\n",j);
j=0;
}
return 0;
}
解析:
n,m即为题目中的描述的牌照区间号。a为车牌号号码,每次以a/10作为循环的下一次开始,一位一位的判断是否含有数字4,a%100以没两位为判断是否含有62。j为牌照数量的循环。两次break保证没有重复的相减。
总结:
这道题我觉得有些难,一开始卡a数位减少的循环在62的判断。思路很是混乱,而且还没有想到break。经过同学的指点,才完成了这道题。
4
第7题
题目概括:
评委会给选手打分,去掉一个最高分和一个最低分,然后计算平均得分。
代码:
#include<stdio.h>
int main()
{
int n,i,x;
double a=0,b=100,c=0,d=0;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%d",&x);
c=c+x;
if(a<x)
{
a=x;
}
if(b>x)
{
b=x;
}
}
d=(c-a-b)/(n-2);
printf("%.2lf\n",d);
c=0;
a=0;
b=100;
}
return 0;
}
解析:一个循环,两个if。不断的比较a与x的大小,并将x的赋值给a,最终求出a为最大值。不断的比较b与x的大小,并将x的值赋值给b,最终求出b为最小值。最后别忘了,将c,a,b全都化为初始值。
总结:难点在于最大值和最小值的判断。
5
第1题
题目概括:
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90100为A;8089为B;7079为C;6069为D 0~59为E;
代码:
#include<stdio.h>
int main()
{
int b;
while(scanf("%d",&b)!=EOF)
{
if(b>=90&&b<=100) printf(“A”);
if(b>=80&&b<=89) printf(“B”);
if(b>=70&&b<=79) printf(“C”);
if(b>=60&&b<=69) printf(“D”);
if(b>=0&&b<=59) printf(“E”);
if(b<0||b>100) printf(“Score is error!”);
printf("\n");
}
return 0;
}
解题思路:
输入一个数,用if判断是否在其区间内。
总结:
这道题并不难,但是因为这道题我再也不会忘记加EOF了,一开始是死循环,后来检查了好多遍才发现是忘记加EOF。
6
第17题
题目概括:
两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。 判断给定的两个数是否是亲和数。
代码:
#include<stdio.h>
int main()
{
int a,b,sum,c,i,j,m;
scanf("%d",&m);
for(k=1;k<=m;i++)
{
scanf("%d%d",&a,&b);
sum=0;
for(i=1;i<a;i++)
{
if(a%i==0)
sum=sum+i;
}
c=0;
for(i=1;i<b;i++)
{ if(b%i==0)
c=c+i;}
if(ac&&bsum)
printf(“YES\n”);
else
printf(“NO\n”);
}
return 0;
}
解析:
先用一个大循环使其符合一共m个例子。然后嵌套使用循环寻找a的因子,相加得sum。并列使用循环寻找b的因子,相加得c。根据亲和数的定义,用if语句进行判断。
总结:(易错点)
别忘记加大循环,判断一共有几个例子的。
7
第8题
题目概括:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初生一头小母牛。求在第n年的时候,共有多少头母牛。
代码:
#include
using namespace std;
int main()
{
int n,i,j;
int a[56] ;
a[1]=1;
a[2]=2;
a[3]=3;
int maxIndex = 2;
while(cin>>n)
{
if(n == 0)
{
break;
}
if(n <= maxIndex + 1)
{
cout<<a[n - 1]<<endl;
}
else
{
for(i = maxIndex + 1;i < n;i++)
{
a[i] = a[i - 1] + a[i - 3];
}
maxIndex = n - 1;
cout<<a[n - 1]<<endl;
}
}
}
解析:
f(n)=1 0<n<4 f(n)=f(n-3)+f(n-1) n>3
f(n)是第n年有的牛数。
第四年后,牛的数量由两部分构成。去年的所有牛f(n-1)。由于不是所有牛都能生小牛,只有3牛以前的老牛才会生小牛,而每只老牛只生一只小牛,第n年所生牛的数量就应该是f(n-3)。
总结:
递推原则,定义函数。
8
第13题
题目概括
输入一个十进制数N,将它转换成R进制数输出。
代码
错误代码
#include<stdio.h>
int main()
{
int n,a,m,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
while(n)
a+=n%m;
n=n/m;
printf("%d",a);
}
return 0;
}
错题分析&解题分析
当时做这道题的时候想到例如10进制转换为16进制的方法一个10进制数除以16.连续除.每次的余数即为这个数的16进制数。
9
第12题
题目概括
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
代码
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void)
{
int n,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;
}
}
错误代码
#include<stdio.h>
int main()
{
int c,n=0,i;
char a;
char b[1001];
while(scanf("%d",&c)!=EOF)
{
for(i=1;i<=1000;i++)
{
scanf("%c",&a);
b[i]=a;
n++;
}
printf("%d",n);
}
for(i=1;i<=n;i++)
{
if(b[i]==b[n-i+1])
printf(“yes”);
else
printf(“no”);
}
return 0;
}
错误分析&解题分析
本来是想将单词分解成字母,从第一字母开始与最后一个字母进行比较。但是如果是这样的话最后的结果也将会是字母的形式出现而非是一个单词。
第二组
10
第一题
题目概括:
第一天吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。求第一天开始吃的时候桃子一共有多少个。
代码:
#include<stdio.h>
int main()
{
int n,a=1,i,j;
while(scanf("%d\n",&n)!=EOF)
{
for(i=(n-1);i>=1;i--)
{
a=(a+1)*2;
}
printf("%d\n",a);
a=1;
}
return 0;
}
解析:
while循环输入n天,根据题意分析可得,第n天的桃子数量等于后一天的数量加1然后再乘2。
注意n和a都要换行。
总结:
一般格式错误都是没有换行。
11
第8题
题目概括:
把一个字符三角形掏空。不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则结束。
代码:
#include <stdio.h>
int main()
{
int n;
char a;
int t=0;
while(scanf("%c",&a)!=EOF)
{
if (a=='@') break;
if (t++) printf("\n");
scanf("%d",&a);
for(int i=1;i<n;i++) printf(" "); printf("%c\n",a);
for(int i=1;i<n;i++)
{
for(int j=1;j<=a-i-1;j++) printf(" ");
printf("%c",a);
for(int j=1;j<=2*i-1;j++)
if (i==n-1) printf("%c",a); else printf(" ");
printf("%c\n",a);
}
}
return 0;
}
解析:
循环输入字符,即花纹。内部进行空心三角形的循环。先是遇到@符号break跳出。然后用if进行行数增加时的换行。然后根据行数和最后一行花纹数量,进行空格和花纹的输入。
总结:
@符号不要忘了加‘’单引号。
这种题目经常出现变换。其实我还没有很清楚怎么输入空格和花纹。
12
第六题
题目概括:
一个数的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22。命名其为Sky数。判断任何一个十进制的四位数,是否为Sky数。
代码.:
#include<stdio.h>
int main()
{
int a;
while(scanf("%d",&a),a)
{
int x,y=0,z=0,t;
x=a%10+a/10%10+a/100%10+a/1000;
t=a;
while(t)
{
y+=t%16;
t/=16;
}
if(y!=x)
{
printf("%d is not a Sky Number.\n",a);
}
else
{
t=a;
while(t)
{
z+=t%12;
t/=12;
}
if(x!=z)
printf("%d is not a Sky Number.\n",a);
else
printf("%d is a Sky Number.\n",a);
}
}
return 0;
}
题目解析:
本题即为一个转换进制的问题。突破点在于掌握10进制转换为16和12进制的方法。即为将一个10进制数除以16.连续除.每次的余数即为这个数的16进制数。
13
第七题
题目概括:
代码:
#include
#include
#include
using namespace std;
int main(){
int n,m;
int x,y,a,b;
while(cin>>n>>m){
if(n==0&&m==0)break;
x=n*n-4*m;
if(x<0)cout<<"No"<<endl;
else{
y=sqrtf(x);
if(y*y!=x)cout<<"No"<<endl;
else{
a=n+y;
b=n-y;
//cout<<a/2<<" "<<b/2<<endl;
if(a%2!=0||b%2!=0)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
}
return 0;
}
错误代码
#include<stdio.h>
#include<math.h>
int main()
{
int n,m,i,j,x=0;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(m==0&&n==0) break;
for(i=-10001;i<=10000;i++)
{
for(j=-10001;j<=10000;j++)
{
if(i*j==m&&i+j==n)
x++;
}
}
if(x!=0)
printf("YES");
else
printf("NO");
}
return 0;
}
解题步骤&错题解析:
m和n的数字太大了,运行时间太长。
重新分析题意,可以改成一个公式,即联立x+y=n;xy=m------>x^2-xn+m=0;
有两个不同解条件是nn-4m>0
两个根x1=(n+sqrt(nn-4m))/2;x2=(n-sqrt(nn-4m))/2;
此时只要判断x1, x2是否为整数。
14
第5题
题目概括:
把一个偶数拆成两个不同素数的和,求有几种拆法。输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
代码:
#include<stdio.h>
#include<math.h>
int main()
{
long n,i,j,f,count;
while(scanf("%ld",&n)!=EOF)
{ if(n==0)break;
for(i=3,count=0;i<=n/2;i+=2)
{
for(j=2,f=0;j<=sqrt(i);j++)
if(i%j==0){f=1;break;}
if(f==0)
for(j=2,f=0;j<=sqrt(n-i);j++)
if((n-i)%j==0){f=1;break;}
if(f==0&&i!=(n-i))
{ count++;
}
}
printf("%ld\n",count);
}
return 0;
}
错误代码:
#include<stdio.h>
int main()
{
int k,i,m[501],n[501],j,a,b;
while(scanf("%d",&b)!=EOF)
{
for(k=1;k<=b;k++)
{
for(i=1;i<=500;i++)
{
scanf("%d %d",&m[i],&n[i]);
for(j=1;j<=500;j++)
{
if(m[i]==n[j])
a++;
if(m[i]==0||n[j]==0)
break;
}
}
printf("%d",&a);
if(m[i]==0||n[j]==0)
break;
}
}
}
错题分析和解题思路:
循环出了问题,例如m[i]=7,这个循环将会循环很多次,而非我们想象的一样。
而且判断素数是其难点,即利用循环判断n是否可以被2到n-1整除。
15
第一题
题目概括:只让找到partner的人去坐过山车,其他的人也不可以。求最多有多少对组合可以坐上过山车。
代码:#include<stdio.h>
#include<string.h>
int a[1100], b[1100], map[1100][1100],mark[1100], m, n;
int path(int x)
{
int y;
for(y = 1; y <= n; y++)
{
if(map[x][y] && !mark[y])
{
mark[y] = 1;
if( b[y] == -1 || path(b[y]))
{
a[x] = y;
b[y] = x;
return 1;
}
}
}
return 0;
}
int main()
{
int i, j, k, x, y, sum;
while(scanf("%d", &k) != EOF && k)
{
memset(a, -1, sizeof(a));
memset(b, -1, sizeof(b));
memset(map, 0, sizeof(map));
scanf("%d%d", &m, &n);
for(i = 0; i < k; i++)
{
scanf("%d%d", &x, &y);
map[x][y] = 1;
}
sum = 0;
for(i = 1; i <= m; i++)
{
if(a[i] == -1)
{
memset(mark, 0, sizeof(mark));
sum += path(i);
}
}
printf("%d\n", sum);
}
return 0;
}
错题分析&解题分析
当时的想法是只是单纯看女生的那一列,计算每个数字出现了多少次并输出出现次数最多的数字的次数。但是这是解题方法出现了问题,后经百度看到了匈牙利算法,这次程序设计报告以这道题收录这道题,并以这道题结尾,以拓宽以后的解题方法,
匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径。
总结
经过这一个学期c++的学习,真的对它有很大的感触。自认为这课要比数学难。它不仅仅要顾及算法还要顾及一些c语言的语法。学习过程中遇到过很多很多的难题,也不断的想要放弃,现在想想也没有什么真正意义上的难,不过是自己对于这门从未接触过的课的抵触。但是它也确实给我打开了一扇通往物联网的门,让我了解到更广阔的天地。虽然我的c语言成绩不好,虽然我不想再在下一学期继续选择这门课。但是真的特别感谢老师,感谢c语言,感谢在c语言学习过程中发现了新世界和新的我。