马上期中考试为了不让自己死的太惨,决定在这里记录一下,沙雕题目WA的沙雕错误
问题一:
判断一个数是否为对称且不大于五位数的素数。
#include <stdio.h>
int main(){
int T,i,j,a;
scanf("%d",&T);
for(i=1;i<=T;i++){
scanf("%d",&a);
int flag=0;
if(a==1){
flag=1;
}else{
for(j=2;j<a;j++){
if(a%j==0){
flag=1;
}
}
}
if(flag==0){
if(a<10&&a>1){
printf("Yes\n");
}else if(a<100&&a>=10&&(a%10==a/10)){
printf("Yes\n");
}else if(a<1000&&a>=100&&a/100==a%10){
printf("Yes\n");
}else if(a<10000&&a>=1000&&a/1000==a%10&&(a%1000)/100==(a%100)/10){
printf("Yes\n");
}else if(a<100000&&a>=10000&&a/10000==a%10&&(a%10000)/1000==(a%100)/10){
printf("Yes\n");
}else{
printf("No\n");
}
}else{
printf("No\n");
}
}
}
错误:
1.变量
(刚开始用数组)后来发现完全没有用必要这么麻烦,直接用i代表循环次数,然后找一个变量代替输入的数就好了。
2.变量初始化
flag作为其中的变量在循环过程中没有把他重新初始化,如果第一个数不是质数的话,后面输进去的数都会被认为是flag等于1,根本不会进入循环里。
3.等号
还是刚开始的问题啊,一个等号和两个等号,打错了dev不报错但是答案就是不对啊。
4.输出格式
一定一定要记得空行啊。
问题二:最强字母
输出一串字符里最强的字母。
#include<stdio.h>
int main(){
char ch,max;
scanf("%c",&ch);
max=getchar();
while((ch = getchar()) != '\n'){
if(ch < max)
max = ch;
}
printf("%c",max);
}
错误
1.居然还不知道getchar的用法,实在不可原谅。
问题三:困扰了许久的求N以内的完数
完数定义:因子和等于本身的数(such as:6=1+2+3)
既然折腾了这么久必定要先上一个错误暴多的代码——
#include<stdio.h>
int main(){
int N,i,j,k=0,sum,l;
int a[100];
scanf("%d",&N);
while(N>=6)
{
for(i=6;i<N;i++)
{
for(j=1;j<N;j++)
{
if(i%j==0)
{
a[k]=j;
k++;
sum=sum+j;
}
}
if(sum==i)
{
printf("%d its factors are ",i);
}
for(l=0;l<k;l++)
{
printf("%d ",a[l]);
}
}
}
}
首先,我们来品一品这个傻子(不是我!)想干什么——
what?N>=6
那么同学,N<6被你吃了吗?
o原来这是他觉得N<6时不会有满足条件的数所以直接跳过了
但是——while中嵌入了两个for循环???
这是在做什么???
哦,你想把小于6的情况排除,那不是用if就行了吗?用while想干啥啊小兄弟。。。
好了,这个时候我们可以把while去掉(因为你发现加这玩意没卵用还会增加时间复杂度)。
显然,第一个for循环用来取1~N的所有数,第二个for循环用来判断因子。
for(i=1;i<N;i++)
{
for(j=1;j<N;j++)
//来来,康康这个循环,它里面判断循环结束的条件竟然是——j<N
//这会出现什么问题呢?
{
if(i%j==0)
{
a[k]=j;
k++;
sum=sum+j;
}
}
很明显,上面循环条件堪称使整个程序的死亡条件,这会带来什么样的影响?
下面if的判断条件是sum == i,如果按照这个程序,sum还包括那个数本身,
sum != i,所以程序是错误的。
最最后,题目要求输出一组数后换行,这个在程序里也没有体现。
问题总结
1.循环嵌套要注意每一个循环的作用,不要做没有意义的循环。(分清楚判断和循环啊啊啊)
2.循环的判断条件,很多时候可能不一定是到最原始的数据结束循环。
3.输出换行。
下面是正确代码
#include<stdio.h>
#include<string.h>
int main(){
int n,i,j,k,l,sum;
int a[1000];
scanf("%d",&n);
for(i=1;i<=n;i++){
sum=0;
k=0;
for(j=1;j<i;j++){
if(i%j==0){
sum=sum+j;
a[k]=j;
k++;
}
}
if(sum==i){
printf("%d its factors are ",i);
for(l=0;l<k;l++){
printf("%d ",a[l]);
}
printf("\n");
}
}
}