1.质数统计
//一点想法
当时不知道怎么循环着输出多行数字
最近偶然知道的一个方法,打算以后都用:while(a–){ }
题目
现有若干行正整数,请你写一段程序分别统计每一行中有多少个质数。
输入格式:
第一行为一个整数n(0<n<10),代表测试用例行数。后边是n行,每行为若干个用空格分隔的正整数。这些正整数的最后是-1,表示此行结束。
输出格式:
为n行,每行一个整数,对应于输入的每一行中质数的个数。
测试用例保证输入合法,且所有整数可以用int存储
输入样例:
2
37 54 18 92 39 45 8 84 75 15 33 83 85 54 81 33 89 -1
17 19 60 77 2 92 38 63 92 69 91 94 11 -1
输出样例:
3
4
答案:
#include<stdio.h>
int isprime(int a);
int main()
{
int n=0;
scanf("%d",&n);
while(n--){
int a=0;
int i=0;
while(a!=-1){
scanf("%d",&a);
if (isprime(a)==1&&a!=-1)
i++;
}
printf("%d\n",i);//就可以直接输入下一行数据啦
}
}
int isprime(int a)
{
//int n=0;
//scanf("%d",&n);
int isprime=1;
int k=0;
for(int i=2;i<=a/2;i++){
if (a%i==0){
k++;
}
}
if(k!=0){
isprime=0;
}
//else
//printf("%d是素数",n);
//return 0;
return isprime;
}
2.数字位数
//一点想法
天哪,我也是才知道这么简单
我当时是在想,先输出这个整数数列,再统计这个整数数列的位数,就像经典题型中输出正整数个数的那个方法,想偏了啊啊啊,这么简单的题目
其实知道n和位数的关系就可以直接用分支结构得出结果了。
题目
有一个整数数列,第1项为1,第2项为12,第3项为123,第4项为1234,依此类推,有第10项为12345678910,第15项为123456789101112131415 等等。现请你写一段程序计算该数列第n项的位数。
输入格式:
只有一个整数 n (1<=n<=10000000)。
输出格式:
只有一个整数,为该数列第n项的位数。
测试用例保证输入合法。
输入样例:
15
输出样例:
21
答案:
#include<stdio.h>
int main()
{
int a=0;
int n=0;
scanf("%d",&a);
if (a>=1&&a<=9)
n=a;
else if(a>9){
n=9+(a-9)*2;
}
printf("%d",n);
return 0;
}
3.谁是凶手
//一点想法
答案不是自己写的,是一个满分答案,但是好像有点长,看起来不是很优化的样子,但是方法好妙,反正我是想不到
//学到的一点东西
1.if(…) {…return 0;}可以结束程序
2.写在代码中了
题目
某处发生了一起凶杀案,警察共抓到了5名嫌疑人,但不能确定他们谁是凶手。于是,警察对他们5个人分别进行了审问。假设这5名嫌疑人分别为5号,6号,7号,8号和9号,审问结果为:5号说8号是凶手,6号说7号是凶手,7号说9号不是凶手,8号说6号不是凶手,9号说7号是凶手。现在警察知道凶手只有一个且一定在这5人当中。后证实他们中有3个人说了实话(也就是说另两个人说了假话)。现请你写一段程序来找出谁是凶手。
输入格式:
第一行为一个整数 n (0<=n<=5),代表说了实话的人数,第2-6行每行均为两个由空格分隔的整数,代表5名嫌疑人的口供。其中前边的整数代表嫌疑人所说的号码,后边的整数代表他说的这个号码是否为凶手(1代表是凶手,0代表不是凶手)。比如输入样例给出的数据就是我们前边所说的情况。
输出格式:
只有一个整数,为凶手的号码。
测试用例保证输入合法。
输入样例:
3
8 1
7 1
9 0
6 0
7 1
输出样例:
8
答案:
#include<stdio.h>
int n,a,b,c,d,e,cnt=0;
int aa=0,bb=0,cc=0,dd=0,ee=0;
main()
{
scanf("%d",&n);
scanf("%d%d%d%d%d%d%d%d%d%d",&a,&aa,&b,&bb,&c,&cc,&d,&dd,&e,&ee);
cnt=0;
if(a==5&&aa==1) cnt++;
if(a!=5&&aa==0) cnt++;
if(b==5&&bb==1) cnt++;
if(b!=5&&bb==0) cnt++;
if(c==5&&cc==1) cnt++;
if(c!=5&&cc==0) cnt++;
if(d==5&&dd==1) cnt++;
if(d!=5&&dd==0) cnt++;
if(e==5&&ee==1) cnt++;
if(e!=5&&ee==0) cnt++;
if(cnt==n) {printf("5"); return 0;}
cnt=0;
if(a==6&&aa==1) cnt++;
if(a!=6&&aa==0) cnt++;
if(b==6&&bb==1) cnt++;
if(b!=6&&bb==0) cnt++;
if(c==6&&cc==1) cnt++;
if(c!=6&&cc==0) cnt++;
if(d==6&&dd==1) cnt++;
if(d!=6&&dd==0) cnt++;
if(e==6&&ee==1) cnt++;
if(e!=6&&ee==0) cnt++;
if(cnt==n) {printf("6"); return 0;}
cnt=0;
if(a==7&&aa==1) cnt++;
if(a!=7&&aa==0) cnt++;
if(b==7&&bb==1) cnt++;
if(b!=7&&bb==0) cnt++;
if(c==7&&cc==1) cnt++;
if(c!=7&&cc==0) cnt++;
if(d==7&&dd==1) cnt++;
if(d!=7&&dd==0) cnt++;
if(e==7&&ee==1) cnt++;
if(e!=7&&ee==0) cnt++;
if(cnt==n) {printf("7"); return 0;}
//以上都没有满足条件,所以开始判断是不是8是凶手
//cnt又=0了;
cnt=0;
if(a==8&&aa==1) cnt++;//5号说8是凶手,cnt+1
if(a!=8&&aa==0) cnt++;
if(b==8&&bb==1) cnt++;
if(b!=8&&bb==0) cnt++;
if(c==8&&cc==1) cnt++;
if(c!=8&&cc==0) cnt++;//7号说9号不是凶手,cnt+1
if(d==8&&dd==1) cnt++;
if(d!=8&&dd==0) cnt++;//8号说6号不是凶手,cnt+1
//cnt==3了,可以直接输出8并结束程序
if(e==8&&ee==1) cnt++;
if(e!=8&&ee==0) cnt++;
if(cnt==n) {printf("8"); return 0;}
//在8是凶手而且只有3个人说实话的情况下
//别人说出8是凶手以及5 6 7 9不是凶手的可能只能够5选3
//另外还有的可能就是别人说假话,8 不是凶手 以及 5 6 7 9是凶手
//将它们一一列举出来,遇到其中三种情况就可以确定了
cnt=0;
if(a==9&&aa==1) cnt++;
if(a!=9&&aa==0) cnt++;
if(b==9&&bb==1) cnt++;
if(b!=9&&bb==0) cnt++;
if(c==9&&cc==1) cnt++;
if(c!=9&&cc==0) cnt++;
if(d==9&&dd==1) cnt++;
if(d!=9&&dd==0) cnt++;
if(e==9&&ee==1) cnt++;
if(e!=9&&ee==0) cnt++;
if(cnt==n) {printf("9"); return 0;}
}
4.两张牌比大小
//一点想法
没有写出来的题目,下面的答案依然是一个满分答案
//学到的一点东西
1.a和b交换值的大小,避免重复的表达某个人赢
2.当有字母来代表某个数字时(如用T来代表10),可用以下方法:
char a1;
int a;
if(a1==‘T’)
a=10;
else
a=a1-‘0’;
题目
现在有一种牌的玩法如下:共36张牌,牌点为2-10,每样4张。两个人玩,每人从所有牌中取两张,然后比较大小,大的方获胜。
比较大小规则如下。 1、两张牌的总牌点值为两张牌的各自牌点值相加后除以10的余数,如一张5一张6,则总牌点为1; 2、比较大小时,比较的是总牌点儿。也就是说总牌点大的一方获胜; 3、当总牌点相等时,则看牌点最大的单张,牌点大的获胜。如一张3一张6胜过一张4一张5; 4、如果两张牌的牌点相等(对子),则不计总牌点,它们一定胜过所有非对子的组合; 5、对子和对子比较,按单张牌点比大小,如对8胜过对7。 6、如果两个人的牌完全一样,则是平局。
现请你写一段程序来判断两个玩家的胜负。
输入格式:
只有一行,为4个字符,前两个代表A的牌,后两个代表B的牌(字符’T’,代表10)。
输出格式:
只有一行,先输出获胜者(两人的牌完全一样时,按A胜输出),然后是一个冒号,最后是牌面(如果是对子,则输出代表单张牌的字符,否则输出总牌点数)。
测试用例保证输入合法。
输入样例:
样例一:
3645
样例二:
85T3
样例三
3455
输出样例:
样例一:
A:9
样例二:
B:3
样例三:
B:5
答案:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
char a1,b1,c1,d1;
scanf("%c%c%c%c",&a1,&b1,&c1,&d1);
int a,b,c,d;
if(a1=='T')
a=10;
else
a=a1-'0';
if(b1=='T')
b=10;
else
b=b1-'0';
if(c1=='T')
c=10;
else
c=c1-'0';
if(d1=='T')
d=10;
else
d=d1-'0';
if(a<b)
{
int tmp=a;
a=b;
b=tmp;
}
if(c<d)
{
int tmp=c;
c=d;
d=tmp;
}
//printf("%d %d %d %d",a,b,c,d);
int s1,s2;
s1=(a+b)%10;
s2=(c+d)%10;
if(a==b&&c==d)
{
if(a>=c)
if(a==10)printf("A:T");
else
printf("A:%d",a);
else
if(c==10)printf("B:T");
else
printf("B:%d",c);
return 0;
}
else if(a==b)
{
if(a==10)printf("A:T");
else
printf("A:%d",a);
}
else if(c==d)
{
if(c==10)printf("B:T");
else
printf("B:%d",c);
}
else if(s1==s2)
{
if(a>=c)
printf("A:%d",s1);
else
printf("B:%d",s2);
}
else
{
if(s1>s2)
printf("A:%d",s1);
else
printf("B:%d",s2);
}
}