学校OJ血的教训

马上期中考试为了不让自己死的太惨,决定在这里记录一下,沙雕题目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");
		}
	} 
}
1.数组初始化
2.求因子的时候,将j<i错误写成j<n

期中考试前错误归纳

1.输出时候看题目要求格式,最后一个数据后面是否有空格。输入输出格式和数据类型对应。scanf取的是地址。
2.碰撞检测,反向考虑问题。
3.大小写。
4.
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值