每日10题6
1084: 用筛法求之N内的素数。
题目描述
- 用筛法求之N内的素数。
输入
- N
输出
- 0~N的素数
样例输入
100
样例输出
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
#include <stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){
if(i==2){
printf("2\n");
}
for(j=2;j<i;j++){
if(i%j==0){
break;
}
if(j==i-1){
printf("%d\n",i);
}
}
}
return 0;
}
1094: 字符串的输入输出处理
题目描述
字符串的输入输出处理。
输入
第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。
输出
先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。
样例输入
2
www.dotcpp.com DOTCPP
A C M
D O T CPP
样例输出
www.dotcpp.com DOTCPP
A C M
D
O
T
CPP
解题思路:
1.有n+个待输入字符串;前面n个有空格,后面的字符串没有空格 (即后面:D O T CPP是四个字符串);
2.因为前面n个字符串原样输出,先用for循环输入( 用gets() )前n个字符串,每输入一串,输出一串用puts()(自带换行)注意但只是换到下一行让你输入,还需再输出一个换行符;
3.之后的字符串不带空格,则选用scanf("%s")并且没有说明结束标志(默认以文件末尾结束:EOF);
4.每输入一串,输出一串,并且换行;
注意事项:
1.输出每一行字符串后,都要输出空白一行,即换行;也就是两个回车;
2.带空格输入用gets(),输出用puts()(这是之前逆序输出的经验,用循环单个输入单个输出提示越界)
3.不带空格输入用scanf("%s",);输出printf("\n")即可;其它也行,最终两个换行符就行;
4.程序中getchar()用来读取输入整数后缓存区中的回车;
#include <stdio.h>
int main(){
int n,i;
char a[1000];
scanf("%d",&n);
getchar();
for(i=0;i<n;i++){
gets(a);
puts(a);
printf("\n");
}
while(scanf("%s",a)!=EOF){
printf("%s\n",a);
printf("\n");
}
return 0;
}
1097: 蛇行矩阵
题目描述
- 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
输入
- 本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
输出
- 对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
样例输入
- 5
样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
#include <stdio.h>
int main(){
int n,i,j,a=1,b=1,k;
scanf("%d",&n);
for(i=1;i<=n;i++){
b=a;
a=a+i;
k=i+1;
for(j=i;j<=n;j++){
if(j==n){
printf("%d\n",b);
}else{
printf("%d ",b);
}
b+=k;
k++;
}
}
return 0;
}
1115: DNA
题目描述
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词–DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧
输入
输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。
输出
输出DNA的形状,每组输出间有一空行。
样例输入
2
3 1
5 4
样例输出
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
while(n--) {
int i, k;
scanf("%d %d",&i,&k); // 3 1
int c = 1,d = 0,a,b;
for(a = 1; a <= (i -1)*k+1; a++) {
for(b = 1; b <= i; b++) {
if(b == c || b == i+1-c) {
printf("X");
}else {
printf(" ");
}
}
c++;
//当c > i 时候,减去 i 重新循环 6 - 5 = 1 重新开始循环 但是 略去第一行 在加个一 但是这样会略去最最后一行
if(c > i) c = c - i +1;
printf("\n");
}
printf("\n");
}
return 0;
}
1116: IP判断
题目描述
在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。
合法的IP是这样的形式:
A.B.C.D
其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不允许有前导零存在,如001这种情况。
现在,请你来完成这个判断程序吧
输入
输入由多行组成,每行是一个字符串,输入由“End of file”结束。
字符串长度最大为30,且不含空格和不可见字符
输出
对于每一个输入,单独输出一行
如果该字符串是合法的IP,输出Y,否则,输出N
样例输入
1.2.3.4
a.b.c.d
267.43.64.12
12.34.56.bb
210.43.64.129
-123.4.5.6
样例输出
Y
N
N
N
Y
N
#include <stdio.h>
int main(){
int a,b,c,d,i;
char num;
while(scanf("%d.%d.%d.%d",&a,&b,&c,&d) !=EOF){
if(a<0||a>255||b<0||b>255||c<0||c>255||d<0||d>255){
printf("N\n");
while((num=getchar())!=EOF&& num!='\n');
}else{
printf("Y\n");
}
a=-1;
b=a;
c=a;
d=a;
}
return 0;
}
1431: [蓝桥杯][2014年第五届真题]分糖果
题目描述
问题描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入
程序首先读入一个整数N(2< N< 100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出
要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出
4
#include <stdio.h>
int main(){
int a[101],n,i,count=0,flag=0;//定义数组,用来储存小朋友的糖数,count定义为老师需要补发的糖数,初始为0,flag为判断是否所有小朋友糖数都相等的标志。
scanf("%d",&n);//输入N,小朋友的个数。
a[0]=0;//把a[0]定义为一个类似于缓冲区的东西,用于暂时的存放数据。
for(i=1;i<=n;i++)
scanf("%d",&a[i]);//为方便起见,把a[i]直接就看成第i个小朋友 。
while(!flag)//flag初始为0,即现在每人糖数不相等,需要进行以下操作进行重新分配。(即使现在糖数相同时 以下的操作也不影响目前的每个人的糖数,因为在每人都相等的情况下,无论进行多少次分配都不会改变数据。)
{
a[0]=a[1]/2;//缓冲区存放第一个小朋友的
for(i=1;i<n;i++)
a[i]=a[i]/2+a[i+1]/2;//用循环语句,依次将前n-1个小朋友的糖果传一半给前一个人
a[n]=a[n]/2+a[0];//由于大家坐成一个圈,所以第n个小朋友把自己的一半去掉之后同时又得到第一个小朋友糖数的一半(即缓冲区的数目)
for(i=1;i<=n;i++){
if(a[i]%2!=0){
a[i]=a[i]+1;
count++;
}
} //用一个循环一次检查是否是奇数,并同时统计老师补发糖的数量。
for(i=1;i<=n;i++){
if(a[i]==a[1])
flag=1;
else{flag=0;break;
}
} //判断是否每个人糖数是否相等,如果糖数都相等,flag=1,此时while(!flag)跳出循环,游戏结束。如果糖数不相等,继续游戏。
}
printf("%d",count);
return 0;
}
1434: [蓝桥杯][历届试题]回文数字
题目描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入
一个正整数 n (10< n< 100), 表示要求满足的数位和。
输出
若干行,每行包含一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
解题思路
-
题目种说5位数和6位数的,并且从小到大;直接按顺序遍历10000到1000000(不包括)之间的数,把么一个数就求其回文和给位数字之和来判断时候复合要求;
-
判断回文:数组也可以做到,但是在本题种使用本人的做法可以简单的将判断回文和求个位数字之和一起方便求得;
-
比如给出1221:1221%10=1
->
1221/10=122->
110+122%10=12->
122/10=12->
1210+12%10=122->
12/10=1->
122*10+1%10=1221 得到1221与原来给出得相等; -
在举个反例:123:123%10=3
->
123/10=12->
310+12%10=32->
12/10=1->
3210+1%10=321;123 != 321 故不是回文数;
求个位数字之和只用在求回文得时候 每次取余得到得数累加求和即可。
- 注意事项:在判断回文的时候,记得用一个临时变量代替正在遍历的数,不然会影响遍历顺序,导致程序出错。
#include <stdio.h>
int main(){
int n,numb=1,i;
scanf("%d",&n);
for(i=10000;i<1000000;i++){
int t=i,sum=0,num=0;
while(t>0){
num=num*10+t%10;
sum += t%10;
t/=10;
}
if(num==i && sum==n){
numb=0;
printf("%d\n",i);
}
}
if(numb){
printf("-1\n");
}
return 0;
}
1442: [蓝桥杯][2013年第四届真题]打印十字图
题目描述
历届试题 打印十字图
时间限制:1.0s 内存限制:256.0MB
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
输入
一个正整数 n (n< 30) 表示要求打印图形的层数。
输出
对应包围层数的该标志。
样例输入
3
样例输出
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
#include <stdio.h>
int main(){
int n,i,j,k;
scanf("%d",&n);
char a[200][150];
int m=n*4+5;
n=n+1;
for(i=0;i<n*4+5;i++)
for(j=0;j<n*4+5;j++)
a[i][j]='.';
for(k=1;k<=n;k++){
for(i=k*2+1;i<=m-2*k;i++){
for(j=2*k+1-2;j<=m-2*k+2;j++){
a[i][j]='$',a[j][i]='$';//打印中间,中间两行两列是颠倒的
}
}
for(i=1+2*k+1;i<=m-2*k-1;i++){
for(j=2*k+1-1;j<=m-2*k+1;j++){
a[i][j]='.',a[j][i]='.';
}
}
}
for(i=1;i<=m;i++){
for(j=1;j<=m;j++){
printf("%c",a[i][j]);
}
printf("\n");
}
return 0;
}
1443: [蓝桥杯][历届试题]数字游戏
题目描述
栋栋正在和同学们玩一个数字游戏。
游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈。栋栋首先说出数字1。接下来,坐在栋栋左手边的同学要说下一个数字2。再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4。下一个同学要往下数三个数,说7。依次类推。
为了使数字不至于太大,栋栋和同学们约定,当在心中数到 k-1 时,下一个数字从0开始数。例如,当k=13时,栋栋和同学们报出的前几个数依次为:
1, 2, 4, 7, 11, 3, 9, 3, 11, 7。
游戏进行了一会儿,栋栋想知道,到目前为止,他所有说出的数字的总和是多少。
样例说明
栋栋说出的数依次为1, 7, 9,和为17。
数据规模和约定
1 < n,k,T < 1,000,000;
输入
输入的第一行包含三个整数 n,k,T,其中 n 和 k 的意义如上面所述,T 表示到目前为止栋栋一共说出的数字个数。
输出
输出一行,包含一个整数,表示栋栋说出所有数的和。
样例输入
3 13 3
样例输出
17
思路
东东所报的数用 t 表示
第1次:t1=1
第2次:t2=7 --> 7=((1+2+3)+1)%13 --> t2=((1+2+3)+t1)%k
第3次:t2=9 --> 9=((4+5+6)+7)%13 --> t3=((4+5+6)+t2)%k
把1+2+3和4+5+6拿出来说:
1+2+3就是首项a为1公差d为1的等差数的前n项和(n的值为3),首项为1,末项为1+(n-1)*d=1+n-1;
前n项和为(首项+末项)*n/2,即(1+1+n-1)*n/2 = 6;
4+5+6就是首项a为4公差d为1的等差数的前n项和(n的值为3),首项为4,末项为4+(n-1)*d=1+n-1;
前n项和为(首项+末项)*n/2,即(4+4+n-1)*n/2 = 15;
然后把上面的过程完善一下:
东东所报的数用 t 表示
第1次:t1=1
第2次:t2=7 --> 7=((1+2+3)+1)%13 --> t2=((1+2+3)+t1)%k --> t2=((1+1+n-1)*n/2+t1)%k;
第3次:t2=9 --> 9=((4+5+6)+7)%13 --> t3=((4+5+6)+t2)%k --> t2=((4+4+n-1)*n/2+t2)%k;
至于每次的首项和末项:定义一个变量 a 作为首项,初值为1,下次的首项就是a+n(即这个例子中的4),每次累加n就可以找到首项,末项用等差数列公式a1+(n-1)*d = a+n-1(d=1, n是通过键盘输入的);那么首项、末项都知道了,规律如上总结;可以解题了……
#include <stdio.h>
int main(){
int n,k,T,i;
long long sum=1,t=1,a=1;//数的初始值与数据类型
scanf("%d %d %d",&n,&k,&T);
for(i=1;i<T;i++){
t=(((a+a+n-1)*n/2)+t)%k;//等差数列公式
sum=sum+t;
a=a+n;
}
printf("%lld",sum);
return 0;
}
1454: [蓝桥杯][历届试题]蚂蚁感冒
题目描述
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数 据代表的蚂蚁感冒了。
输出
要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入
5
-10 8 -20 12 25
样例输出
3
#include <stdio.h>
int main(){
int n,a,i,f,s,q=0,h=0;
scanf("%d %d",&n,&f);//输入个数n与第一个数f
for(i=1;i<n;i++){
scanf("%d",&s);
if(abs(f)<abs(s)&&s<0) h++;//当在首个蚂蚁右侧并且反向 必感冒
if(abs(f)>abs(s)&&s>0) q++;//当在首个蚂蚁左侧并且正向 必感冒
}
if(f>0 && h!=0||f<0 && q!=0){//当首个感冒蚂蚁方向为正时 在首个蚂蚁右侧并且反向 为 0 或
printf("%d",q+h+1);//当首个感冒蚂蚁方向为负时 在首个蚂蚁左侧并且反向 为 0 则不会被感冒除首个感冒
}else{
printf("1");
}
return 0;
}
1458: [蓝桥杯][2013年第四届真题]错误票据
题目描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
输入
要求程序首先输入一个整数N(N< 100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。
每个整数代表一个ID号。
输出
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
样例输入
2
5 6 8 11 9
10 12 9
样例输出
7 9
#include <stdio.h>
int cmp(const void *a,const void *b){//自定义排序函数
return *(int *)a - *(int *)b;
}
int main(){
int a[10000],n,j;
int i=0,m=0,m2=0;
scanf("%d",&n);
while(~scanf("%d",&a[i])){ //一直输入到文本结束,ctrl+Z;
i++; // ~ 符号等同于 !=EOF
}
qsort(a,i,sizeof(int),cmp);
int t=a[0];
for(j=1;j<i;j++){
if(a[j]==a[j+1]-2){ //找断号
m=a[j]+1;
}
if(a[j]==a[j+1]){ //找重号
m2=a[j];
}
}
printf("%d %d",m,m2);
return 0;
}