(一):problem A
题意:输入多组数据,对数据进行范围内的判定,输出对应的结果。
思路:需多组输入数据,因此需要用到while多组输入语句,此题可利用if语句对数据进行判定,分别输出结果。
细节:此题需输入多组数据,范围的表示,利用&&,每组结果需要换行输入,输出。
源码:
#include <iostream>
using namespace std;
int main()
{
int score;
while(cin>>score)
{
if(score>=90&&score<=100) cout<<"A"<<endl;
if(score>=80&&score<=89) cout<<"B"<<endl;
if(score>=70&&score<=79) cout<<"C"<<endl;
if(score>=60&&score<=69) cout<<"D"<<endl;
if(score>=0&&score<=59) cout<<"E"<<endl;
if(score<0||score>100) cout<<"Score is error!"<<endl;
}
return 0;
}
总结收获:此题对多组数据进行处理,因此需要用到while多组数据输入和if语句对数据进行判断,多组数据需换行处理,并且让我用&&对范围进行表示,多个知识点的结合。
(二):problem B
题意:在一个范围内,对范围内的所有三位整数进行处理,判断是否存在各位数字的立方和是否等于其本身。分别输出各个范围内的水仙花数。
思路:此题需先将个位、十位、百位分别求出来,然后利用if语句利用条件对数据进行判定。将符合条件的数据储存在一个数组中,后一块输出。还需判断范围内是否存在符合条件的数据。
细节:初始化一个字符为零,利用此字符判断是否含有符合条件的数据,需要多组数据输入,每组数据中空格输出,并需要多组结果换行输出。
源码:
#include <iostream>
using namespace std;
int main()
{
int m,n;
while (cin>>m>>n)
{
int x=0;
int p[1000];
for(int i=m; i<=n; i++)
{
int a=0,b=0,c=0;
a=i/100;
b=i/10%10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
{
p[x]=i;
x++;
}
}
if(!x) cout<<"no"<<endl;
else
{
for(int j=0;j<x;j++)
{
cout<<p[j];
if(j<x-1) cout<<" ";
}
cout<<endl;
}
}
return 0;
}
总结收获:此题锻炼了我的对数的处理,每一组数据空格输出,让我认识到需对每组数据的第一个数和后面的数分别进行处理,每组数据结果还需换行处理。
(三):problem C
题意:输入多组测试数据,分别求出每一组数据中所有奇数的积。
思路:对数据进行奇数判定,分别求出每组数据的积,然后换行输出。
细节:需利用while语句多组数据的输入,需要利用for循环进行每组数据多个数据的输入,并利用if语句对奇数判断。
源码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,i;
int a;
while (cin>>n)
{
int c=1;
for(i=0;i<n;i++)
{
cin>>a;
if(a%2!=0)
c=c*a;
}
cout<<c<<endl;
}
return 0;
}
总结收获:此题利用多组数据数据的输入和每组数据的多个输入,并对数据进行奇数判断,锻炼了我的对while语句和for语句的使用。
(四):problem D
题意:在一个范围内,对应一个表达式的对应范围,判断此范围内是否含有素数,以"0 0"结束。
思路:此题需要可先将函数范围内的所有数储存在一个数组内,利用for和if语句,利用素数定义判定。当x=0;y=0时,结束此循环,此题还需多组输入,因此需要用到while语句。
细节:此代码的嵌套循环较多,需注意层次,要在while内输出结果,因为一个结果对应一组数据。
源码:
#include <iostream>
#include <cmath>
using namespace std;
int a[100];
int main()
{
int n,i,j,x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
if(x==0&&y==0)
break;
int flag=0;
for(i=0,n=x;n<=y;i++,n++)
{
a[i]=n*n+n+41;
}
for(i=0;i<=y-x;i++)
{
for(j=2;j<a[i];j++)
{
if(a[i]%j==0)
break;
}
if(j<a[i]||a[i]==1)
{
flag=1;
break;
}
}
if(flag==1)
cout<<"Sorry"<<endl;
else
cout<<"OK"<<endl;
}
总结收获:此题让我利用素数的判定,对一个范围找到一个新的范围,并判断此范围内的所有数是否为素数,多组数据输入,并利用两个特殊的数作为结束语,将while,if,for语句结合起来。
(五):problem E
题意:计算一个多项式前n项和,此多项式根据第几项改变正负号。
思路:此多项式有正有负,但存在着规律,正负会根据着项次的奇偶性,因此可利用for循环来表示。
细节:此题对数据的整形还是小数有要求,需要注意,需要对项次的奇偶进行分类,每一个数据输出后还需换行。
源码:
#include<stdio.h>
#include<math.h>
int main()
{
int m,i,j;
float s;
scanf("%d",&m);
int a[1000];
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<m;i++)
{
s=0;
for(j=0;j<a[i];j++)
{
if(j%2==0)
s=s+(float)1/(j+1);
if(j%2==1)
s=s-(float)1/(j+1);
}
printf("%.2f\n",s);
}
return 0;
}
总结收获:此题运用两次for循环,需要有一定的逻辑性,通过求余对数奇偶性判断,因为在题的前半部分定义的j为整形,当在后面用到时而且需要位小数,可以利用前面加个float改变其数据类型。
(六):problem F
题意:对于一个长度一定的递增有序的偶数列,每m个输出一个平均值,不足的按实际情况输出。
思路;利用两个for循环对于每组m个数进行相加,然后利用if语句求余判断是否整除,如果没有整除,再计算剩余的数。
细节:此题当输出结果时,对于空格有要求,可以利用i对其项数判定,然后最后判定是否整除,然后输出,还需注意对sum赋初始值的位置,需在循环里面,因为多组输入数据。
源码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int j,a,i,n,m,sum;
while(cin>>n>>m)
{
a=0;
for(i=0;i<n/m;i++)
{
sum=0;
if(i>0)
cout<<" ";//避免多输出空格,后面有可能整除
for(j=0;j<m;j++)
{
a=a+2;
sum=sum+a;
}
cout<<sum/m;
}
if(n%m!=0)
{
sum=0;
for(j=0;j<n-n/m*m;j++)
{
a=a+2;
sum=sum+a;
}
cout<<" "<<sum/j;
}
printf("\n");
}
return 0;
}
总结收获:此题验证了多组处理数据时,对变量赋初始值时的位置的重要性,利用两重for循环将每一定数量的值进行相加,对于数据空格输出,利用i的值进行输出空格。如果输出每组数据换行输出,要在最外面的一重循环中进行换行处理。
(七)problem H
题意:一头母牛每年年出生一头小牛。每头小牛四年后开始生小牛,n年时有多少头牛。
思路:起初的母牛每年都会生一头小牛,而每一头小牛四年后会每年生一头小牛,既可以利用递归算法计算第n年的牛的数量。即第n年的小牛数为前一年的加上三年前的。
细节:需要多组输入,因为几年后数量逐渐增加,为防止数据溢出可定义长整形。递推式需要前三项数值。因此需对前三项分别写出。
源码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,n;
long long a[60];
while(scanf("%d",&n))
{
if(n==0)
break;
a[1]=1;a[2]=2;a[3]=3;
if(n==1)
printf("%lld\n",a[1]);
else if(n==2)
printf("%lld\n",a[2]);
else if(n==3)
printf("%lld\n",a[3]);
else
{
for(i=4;i<=n;i++)
{
a[i]=a[i-3]+a[i-1];
}
printf("%lld\n",a[n]);
}
}
return 0;
}
总结收获:此题利用递归公式通过题意找规律,需要注意数据的范围,当利用递归公式时,还需要利用到for循环,还可以利用if else语句将前几项的结果分别讨论输出结果。
(八):problem I
题意:将数据的绝对值进行排序,然后输出排完序后对应的原值,每个数值之间有一个空格,遇零结束。
思路:可用结构体做,结构体中两个数:一个是输入的数的绝对值,用来排序用;另一个是就是原来的数,用来输出时用;只需在输入时简单控制下即可做到。可以利用函数,在主函数前定义一个对绝对值排序的函数,然后进行调用。输入的数值有多个,将其储存在一个数组里。
细节:此题需要多组输入数据因此需要用到while语句,还要注意的是怎么给结构体中的数进行排序,利用sort函数,要在主函数之前定义上或之后定义上才可调用,还要加上对于函数所需要的头文件#include<algorithm>。
源码:
#include<algorithm>
#include<iostream>
using namespace std;
bool cmp(int a,int c)
{
return abs(a)>abs(c);
}
int b[110];
int main()
{
int i,n;
while(cin>>n)
{
if(n==0) break;
else
{
for(i=0;i<n;i++)
cin>>b[i];
sort(b,b+n,cmp);
for(i=0;i<n;i++)
{
if(i==0) cout<<b[i];
else
cout<<" "<<b[i];
}
cout<<endl;
}
}
return 0;
}
总结收获:此题对数据绝对值进行排序,结构体中利用两个数,一个排序一个输出,用到了绝对值和sort函数,也可不用sort函数,可以利用一个for循环将其绝对值进行比较排序,但如果数值较多可能会造成超时。最后还是空格输出的问题,利用i进行判别输出,防止多输出空格。
(九):peoblem J
题意:将一个数插入一组从小到大排好的数据中,排完之后仍然是从小到大的。
思路:首先利用if语句判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后,此元素之后的数,依次后移一个位置(利用for循环和数组)。
细节:此程序遇零结束,需要对数进行判断,而且还需利用while语句进行多组输入,插入的数可以用for循环进行从前向后的与每个数比较,插入后利用for循环和数组将每一个数后移,最后输出。
源码:
#include<iostream>
#include<cmath>
using namespace std;
int a[110];
int main()
{
int n,m,i,j,b,c;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
for(i=0;i<n;i++)
{
cin>>a[i];
}
if(m>a[n-1]) a[n]=m;
else
{
for(i=0;i<n;i++)
{
if(a[i]>m)
{
b=a[i];
a[i]=m;
for(j=i+1;j<=n;j++)
{
c=a[j];
a[j]=b;
b=c;
}
break;
}
}
}
for(i=0;i<=n;i++)
{
cout<<a[i];
if(i<n)
cout<<" ";
}
cout<<endl;
}
return 0;
}
总结收获:此程序将一个数插入一组有序的数据中,为减少程序的运行时间可先判断是否大于最后一个数,然后插入其中,对于一个程序分析能力非常重要,将一个程序分成多个情况可能会降低程序的运行时间。
(十):problem K
题意:求出n个老师的工资所需要的人民币的张数,每个老师的工资都为整数。
思路:将每一个老师的工资通过除法求出每一中人民币所需要的张数,然后加到一起储存在一个数组里,最后求出数组的和。
细节:需要测试多组测试数据,遇零结束。在一个循环中将其结果累加输出需要在for循环外面对变量赋初始值,结果输出后换行。
源码:
#include<cmath>
#include<iostream>
using namespace std;
int a[100];
int b[100];
int main()
{
int n,i,s1,s2,s3,s4,s5,s6;
while(cin>>n)
{
if(n==0) break;
int c=0;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
s1=a[i]/100;
s2=(a[i]-s1*100)/50;
s3=(a[i]-s1*100-s2*50)/10;
s4=(a[i]-s1*100-s2*50-s3*10)/5;
s5=(a[i]-s1*100-s2*50-s3*10-s4*5)/2;
s6=a[i]-s1*100-s2*50-s3*10-s4*5-s5*2;
b[i]=s1+s2+s3+s4+s5+s6;
c=c+b[i];
}
cout<<c<<endl;
}
return 0;
}
总结收获:测试一组数据完输出后要对变量重新赋值,求和时可在for循环内累加求和,减少循环次数,简化程序。
(十一):problem L
题意;判断一个字符串是否是回文串,即正读反读都一样,如果是输出yes反之输出no。
思路:输入一个字符串,利用strlen(str)计算出其长度然后将每一个字符储存在数组中,然后利用for循环进行字符的比较,当遇到前面的字符与后面的字符不一样的时候,输出no然后结束程序。
细节:输入一个字符串可以用gets输入,因为空格也是字符用getchar()对其处理,比较时利用i和j进行循环,注意循环条件应为i大于j才可将字符比较完。
源码:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i,j,n,l;
char str[100000];
while(cin>>n)
{
getchar();
while(n--)
{
gets(str);
l=strlen(str);
for(i=0,j=l-1;i<j;i++,j--)
{
if(str[i]!=str[j])
{
cout<<"no"<<endl;
break;
}
}
if(i>=j)
cout<<"yes"<<endl;
}
}
return 0;
}
总结收获:对于字符或字符串的输入需要对空格进行处理,防止程序将空格当成字符对于一个字符串,如果长度不定,可定义一个比较大的数组,然后利用strlen计算出长度后将字符储存在数组中,对于从前向后的字符比较,可利用两个变量循环进行for循环。
(十二):problem O
题意:两个集合A和B,输出A-B的集合的元素,如果为空集输出NULL。
思路:先将两个集合中的元素进行排序,从小到大,然后利用两重for循环看是否找到两个集合中相同的元素,如果有则将此元素从集合A中剔除,最后输出新的集合A。
细节:输入多组测试数据,遇零结束,在while循环中对0 0的情况进行讨论。对集合A和集合B中的元素进行排序时利用两重for循环,对于在B集合中找相同元素时可定义一个变量进行判断。最后在while内循环的最外层循环进行换行。
源码:
#include<cstdio>
#include <iostream>
#include <string>
using namespace std;
int a[110],b[110];
int main()
{
int n,m,i,j,flag=1,k=1,t;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(j=0;j<m;j++)
{
cin>>b[j];
}
for(i=0;i<m;i++)
{
for(j=0;j<m-i-1;j++)
{
if(b[j]>b[j+1])
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
flag=1;
for(i=0;i<n;i++)
{
k=1;
for(j=0;j<m;j++)
{
if(a[i]==b[j])//在集合A中找到与集合B中相同的元素,如果有则结束,进行下一个循环,如果没有,则输出集合A中的元素。
{
k=0;
break;
}
}
if(k==1)
{
printf("%d ",a[i]);
flag=0;
}
}
if(flag==1)
{
printf("NULL");
}
printf("\n");
}
return 0;
}
总结收获:对于一组元素进行排序,可利用两重for循环进行排序,一个数一个数的向后移动查找比较,减少循环次数。定义两个变量,元素是否相同进行比较,如果有结束其一层循环,其中一个变量变化,如果变量没有变化,输出此元素,另一变量也发生变化,最后判断另一边是否发生变化进行判断是否是空集。
(十三):problem Q
题意:对于两个数,其中一个真约数之和等于另一个数,另一个数的真约数之和等于另外一个数。
思路:分别利用两个for循环和求余办法求出真约数之和,然后利用并的条件进行判断。
细节:进行for循环时需要内层循环外定义求和变量,并对其赋值,因为n组数据需要两重循环,真约数不包含自身及循环到本身的前一个数即可。每一组结果换行输出。
源码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,i,j,k,a,b,sum1,sum2;
cin>>n;
for(i=0;i<n;i++)
{
sum1=0,
sum2=0;
cin>>a>>b;
for(j=1;j<a;j++)
{
if(a%j==0)
sum1+=j;
}
for(k=1;k<b;k++)
{
if(b%k==0)
sum2+=k;
}
if(sum1==b&&sum2==a)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
总结收获:n组数据,两重循环,是否整除利用求余判断,两种情况同时符合时利用并(&&)的使用。
(十四):problem W
题意:计算一个区间中不含有62连号的数字或含有4的数字的数字个数。遇零数对结束。
思路:输入多组数据,利用while语句输入,最大数的位数一定,可将每一个数字和每一个两位连数分别提取出来,然后if语句进行判断。
细节:对于一个区间之间总数的个数为大数减小数加一,判断是否是不吉利数字时,利用或判断,因为只要含有62或4就是不吉利数字,进行减一。
源码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long m,n;
int i,k,l,a,b,c,d,e,f,g,h,o;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
int s=m-n+1;
for(i=n;i<=m;i++)
{
a=i/100000;
b=(i-a*100000)/10000;
c=(i-a*100000-b*10000)/1000;
d=(i-a*100000-b*10000-c*1000)/100;
e=(i-a*100000-b*10000-c*1000-d*100)/10;
f=i-a*100000-b*10000-c*1000-d*100-e*10;
g=i/10000;
h=(i-a*100000)/1000;
k=(i-a*100000-b*10000)/100;
l=(i-a*100000-b*10000-c*1000)/10;
o=i-a*100000-b*10000-c*1000-d*100;
if(a==4||b==4||c==4||d==4||e==4||f==4||g==62||h==62||k==62||l==62||o==62) s--;
}
cout<<s<<endl;
}
return 0;
}
总结收获:对于数值可能较大的数字定义为长整形,判断数字是否为不吉利数字时,只要含有62或4就是,需要用到或(||)不可单独判断,会造成对数字的重复判断,因为一个数字可能既含有62也含有4。
(十五)problem A
题意:悟空第一天吃掉桃的一半多一个,以后每一天吃掉所剩桃的一半多一个,到第n天只剩下一个桃,判断一共多少个桃。
思路:此题可采取逆向思维的方法,从第n天往前推断。
细节:第n天的时候吃了n-1回,n=n-1后才可利用while(n--)循环。
源码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,a,s1,s2,i;
while(cin>>n)
{
n=n-1;
s2=1;
while(n--)
{
s1=(s2+1)*2;
s2=s1;
}
cout<<s1<<endl;
}
return 0;
}
总结收获:根据结果和一定的规律计算开始时的数值时可利用逆向思维的办法计算结果,多组测试数据输入,输出结果时要在while输入循环输入中输出结果。