2018第一届东电智能科技竞赛:初赛—C语言程序编辑题

大多是水题,四套卷子共12题,这里列出11道,有道是重复的。

1.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问在100000内有哪些满足要求?

#include<stdio.h>
#include<math.h>
int iswanquan(int num);
int main(int argc,char* argv[])
{
	int i;
	for(i=1;i<=100000;i++)
	{
		if(iswanquan(i+100)&&iswanquan(i+268))
		{
			printf("%d\n",i);
		}
	}
	return 0;
}
int iswanquan(int num)
{
	double ind=sqrt((double)num);
	if(ind-(double)(int)ind)
		return 0;
	else
		return 1;
}

2.输入某年某月某日,判断这一天是这一年的第几天?

#include<stdio.h>
int isrun(int year);
int main(int argc,char* argv[])
{
	int year,month,day;
	printf("年>> ");
	scanf("%d",&year);
	printf("月>> ");
	scanf("%d",&month);
	printf("日>> ");
	scanf("%d",&day);
	int monthx[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	if(isrun(year))
		monthx[2]=29;
	if(month<1||month>12)
		printf("ERROR MONTH\n");
	else if(day<1||day>monthx[month])
		printf("ERROR DAY\n");
	else
	{
		int sum=day,i;
		for(i=1;i<month;i++)
			sum+=monthx[i];
		printf("%d\n",sum);
	}
	return 0;
}
int isrun(int year)
{
	if(year%100&&year%4==0||year%400==0)
		return 1;
	else
		return 0;
}

3.输出国际象棋棋盘

??!这什么鬼,应该是一白一黑,奇偶行交错吧。用O表示白,X表示黑。

#include<stdio.h>
int main(int argc,char* argv[])
{
	int i,j;
	for(i=1;i<=8;i++)
		for(j=1;j<=8;j++)
		{
			if(i%2&&j%2||i%2==0&&j%2==0)
				putchar('O');
			else
				putchar('X');
			if(j==8)
				putchar('\n');
		}
	printf("\nO---White,X---Black\n");
	return 0;
}

4.判断101-200之间有几个素数,并输出所有素数。

#include<stdio.h>
#include<math.h>
int isprime(int num);
int main(int argc,char* argv[])
{
	int i,num;
	for(i=101,num=0;i<=200;i++)
	{
		if(isprime(i))
		{
			printf("%d  ",i);
			num++;
		}
	}
	printf("\n\nTOTAL: %d\n",num);
	return 0;
}
int isprime(int num)
{
	int ind;
	for(ind=2;ind<=(int)sqrt((double)num);ind++)
	{
		if(!(num%ind))
			return 0;
	}
	return 1;
}

5.将一个正整数分解质因数,如:输入90,输出90=2*3*3*5。

#include<stdio.h>
#include<math.h>
int isprime(int num);
int main(int argc,char* argv[])
{
	int num;
	scanf("%d",&num);
	if(num<1)
	{
		printf("ERROR\n");
		return 0;
	}
	if(isprime(num))
	{
		printf("%d = %d\n",num,num);
		return 0;
	}
	int i;
	printf("%d = ",num);
	for(i=2;i<=num;i++)
	{
		if(isprime(i))
		{
			while(num%i==0)
			{
				printf("%d",i);
				num/=i;
				if(num!=1)
					putchar('*');
				else
					putchar('\n');
			}
		}
	}
	return 0;
}
int isprime(int num)
{
	int ind;
	for(ind=2;ind<=(int)sqrt((double)num);ind++)
	{
		if(!(num%ind))
			return 0;
	}
	return 1;
}

6.求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字,例如输入a=2,n=5时,s=2+22+222+2222+22222。

#include<stdio.h>
int main(int argc,char* argv[])
{
    int a,n,sum;
    printf("a? >>");
    scanf("%d",&a);
    printf("count? >>");
    scanf("%d",&n);
    printf("s = ");
	int i,t=a;
	for(i=1,sum=0;i<=n;i++)
	{
		printf("%d%c",a,i==n?'\n':'+');
		sum+=a;
		a=a*10+t;
	}
	printf("s = %d\n",sum);
	return 0;
}

7.输入两个正整数m和n,求最大公因数和最小公倍数。

#include<stdio.h>
int gcd(int m,int n);
int main(int argc,char* argv[])
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("GCD = %d\nLCM = %d\n",gcd(m,n),m*n/gcd(m,n));
	return 0;
}
int gcd(int m,int n)
{
	return n?gcd(n,m%n):m;
}

8.求1000以内的所有完全数。

#include<stdio.h>
int main(int argc,char* argv[])
{
    int i,j,s;
    for(i=1;i<=1000;i++)
    {
		for(j=1,s=0;j<i;j++)
		{
			if(!(i%j))
				s+=j;
		}
		if(s==i)
			printf("%d\n",i);
    }
	return 0;
}

9.输入3个数a、b、c,按大小顺序输出(这道题重复一次……)

#include<stdio.h>
void swab(int* a,int* b);
int main(int argc,char* argv[])
{
	int x,y,z;
	scanf("%d%d%d",&x,&y,&z);
	if(x>y)
		swab(&x,&y);
	if(x>z)
		swab(&x,&z);
	if(y>z)
		swab(&y,&z);
	printf("Large-Small>>%d  %d  %d\n",z,y,x);
	printf("Small-Large>>%d  %d  %d\n",x,y,z);
	return 0;
}
void swab(int* a,int* b)
{
	int x=*a;
	*a=*b;
	*b=x;
}

10.有n个正整数,使其前面各数向后移动m个位置,最后m个数变成最前面的m个数。

题意说的不是很清楚,意思应该是输入n个数后,把它们向后移动m个位置,后面移出去的从前面移进来。也就是需要来实现循环右移。需要注意的一点是,m可能大于n,所以需要处理m在0-n之间后再输出。

#include <stdio.h>
int array[1000];
int main(void)
{
	int n,m;
	printf("Count? >>");
	scanf("%d",&n);
	printf("Please input %d number\n>> ",n);
	int i;
	for(i=1;i<=n;i++)
		scanf("%d",&array[i]);
	printf("m? >>");
	scanf("%d",&m);
	for(;m>n;m-=n);
	m=n-m+1;
	for(i=1;i<=n;i++)
	{
		printf("%d ",array[m]);
		if(++m>n)
			m=1;
	}
	return 0;
}

11.有n个人围成一圈,顺序排号。从第一个人开始报数(1-3报数),凡是报到3的人退出圈子,问最后留下的是原来的第几号位。

分析一下,用数组先表示这n个人是否还在圈子之中,全部初始化为1。从头开始不断扫数组,每移过两个还在圈子里的人,就把第三个在圈子里的人移出圈子,不断遍历直至有n个人被移出了圈子,最后那个被移出去的就是最后留下的。输出他的数组标号就是了。

#include <stdio.h>
int array[1000];
int main(void)
{
	int i,n,m;
	printf("n? >>");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		array[i]=1;
	i=0,m=0;
	while(1)
	{
		int count=3;
		while(count--)
		{
			for(i++;!array[i];i++)
			{
				if(i>n)
					i=0;
			}
			if(i>n)
				i=1;
		}
		array[i]=0;
		m++;
		if(m==n)
		{
			printf("%d\n",i);
			break;
		}
	}
	return 0;
}
嘿嘿,谁知道这比赛明年还有没有呢,希望对网上意外发现的你有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值