C语言入门水题总结2

小光棍数

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述
最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?
输入
有多组测试数据。第一行一个整数n,表示有n组测试数据。接下来的每行有一个整数m。
输出
输出第m个小光棍数。
样例输入
1
1
样例输出
471

关键点:发现其中的同余定理,只要后三位数为471,即可得出,其次,注意到m的取值范围
#include<stdio.h>
int main()
{
	int n;
	long long m;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%lld",&m);
		printf("%lld\n",471+(m-1)*1000);
	}
}

黑色帽子

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述
        最近发现了一个搞笑的游戏,不过目前还没玩过。一个舞会上,每个人头上都戴着一顶帽子,帽子只有黑白两种,黑的至少有一顶。每个人都能看到别人帽子的颜色,可是看不见自己的。主持人先让大家看看别人头上戴的是什么帽子,然后关灯,如果有人认为自己戴的的黑色帽子,就打自己一个耳光( ,都很自觉,而且不许打别人的哦),开灯,关灯,开灯……。因为都不想打自己耳光,所以不确定的情况下都不会打自己的,现在有n顶黑色帽子,第几次关灯才会听到有人打自己耳光?
输入
第一行只有一个整数m(m<=100000),表示测试数据组数。
接下来的m行,每行有一个整数n(n<=100000000),表示黑色帽子的顶数。
输出
输出第几次关灯能听到耳光声,每组输出占一行。
样例输入
1
2
样例输出
2

注:刚开始我以为不管有(一除外)几顶帽子,参加者在第一次熄灯后发现没人打自己,就会判断自己是黑帽子,所以都为二,现假设为n顶,戴黑帽子者看到是n-1顶,每次等待其余黑帽者共为n-1次,加上开头一次,则为n次

#include<stdio.h>
int main(void)
{
	int n,m;
	scanf("%d",&m);
	while(m--&&scanf("%d",&n))
	{
		printf("%d\n",n);
	}
}

房间安排

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 2
描述

2010年上海世界博览会(Expo2010),是第41届世界博览会。于2010年5月1日至10月31日期间,在中国上海市举行。本次世博会也是由中国举办的首届世界博览会。上海世博会以“城市,让生活更美好”(Better City,Better Life)为主题,将充分探索21世纪城市生活。

这次世博会总投资达450亿人民币,创造了世界博览会史上的最大规模记录。吸引200个国家和国际组织参展。预计有7000万人次的参观者。

为了更好地接待在这期间来自世界各地的参观者,如何合理安排各宾馆的住房问题提到了日程。组委会已接到了大量的客户住宿定单,每张定单的内容包括要住宿的房间数,开始住宿时间和要住的天数。为了便于整个城市各宾馆的管理,组委会希望对这些定单进行安排,目的是用尽可能少的房间来满足这些定单,以便空出更多的房间用于安排流动游客。

组委会请求DR.Kong来完成这个任务,对这些定单进行合理安排,使得满足这些定单要求的房间数最少。

假设:某个定单上的游客一旦被安排到某房间,在他预定住宿的期间内是不换房间的。为了简化描述,定单上的开始住宿时间为距离现在的第几天。例如,定单为(10,30,5)表示游客要求使用10个房间,第30天开始连住5天。

输入
第一行:T 表示有T组测试数据
每组测试数据第一行:N 表示定单数
每组测试数据接下来有N行,每行有三个整数 A B C 表示房间数,开始住宿时间和天数
1<=T<=100
1<=N<=10000 1<=A<=10 1<=B<=180 1<=c<=10
输出
输出一个整数,为满足所有定单要求的最少房间数。
样例输入
1
3
3 10 4
4 9 3
3 12 6
样例输出
7

思路:一开始想着用结构体去实现,浪费了大量时间,后来发现了只要先将每笔订单的开始到结束时间都用加上所用房间数,若时间重复,则房间累加,求出最大值即可

#include<stdio.h>  
#include<algorithm>  
using namespace std;  
int s[10005];  
int main()  
{  
    int i,j,n,test,ans,a,b,c;  
    scanf("%d",&test);  
    while(test--)  
    {  
        scanf("%d",&n);  
        for(i=0,ans=0;i<n;i++)  
        {  
            scanf("%d%d%d",&a,&b,&c);  
            for(j=b;j<b+c;j++)
            {
            	s[j]+=a;
            	ans=max(ans,s[j]);
            }
			}
        printf("%d\n",ans); 
		for(i=1;i<10005;i++)
			s[i]=0; 
    }  
    return 0;  
}  

蛇形填数

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入
直接输入方陈的维数,即n的值。(n<=100)
输出
输出结果是蛇形方陈。
样例输入
3
样例输出
7 8 1
6 9 2
5 4 3

一道不难却让我死循环了无数回的题目

#include<stdio.h>//正确代码
int a[101][101];
int main(void)
{
	int n,s=1,i,j,k;
	scanf("%d",&n);
	i=1;j=n;
	a[1][j]=s;
	k=n*n;
	while(s<k)
	{
			
		while(i+1<=n&&a[1+i][j]==0)	a[++i][j]=++s;//向下 
		
		while(j-1>=1&&a[i][j-1]==0)	a[i][--j]=++s;//向左
		
		while(i-1>=1&&a[i-1][j]==0)	a[--i][j]=++s;//向上
		
		while(j+1<=n&&a[i][j+1]==0)	a[i][++j]=++s;//向右
	}
			 
	
	for(i=1;i<n+1;i++){
		for(j=1;j<n+1;j++){
			printf("%d ",a[i][j]);
		} 
		printf("\n");
}
}

#include<stdio.h>//错误代码,我看了很就才发现的错误
int a[101][101];
int main(void)
{
	int n,s=1,i,j,k;
	scanf("%d",&n);
	i=1;j=n;
	a[1][j]=s;
	k=n*n;
	while(s<k)
	{
	
		while(i+1<=n&&a[++i][j]==0)	a[i][j]=++s;//向下 
		
		while(j-1>=1&&a[i][--j]==0)	a[i][j]=++s;//向左
		
		while(i-1>=1&&a[--i][j]==0)	a[i][j]=++s;//向上
		
		while(j+1<=n&&a[i][++j]==0)	a[i][j]=++s;//向右
}
			 
	
	for(i=1;i<n+1;i++){
		for(j=1;j<n+1;j++){
			printf("%d ",a[i][j]);
		} 
		printf("\n");
}
}


无线网络覆盖

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述

我们的乐乐同学对于网络可算得上是情有独钟,他有一个计划,那就是用无线网覆盖郑州大学。

现在学校给了他一个机会,因此他要购买很多的无线路由。现在他正在部署某条大道的网络,而学校只允许把他的无线路由器放在路的正中间。我们默认这条大道是笔直的并且它在任何地方的宽度都一样。并且所有的路由器的覆盖面积是相同的。现在乐乐计算出这条大道的长和宽,以及路由器的覆盖半径,想请你帮忙,帮他计算出他最少要购买的路由器的数量。

注意:为了防止某种干扰,两台无线路由之间的最小距离不能小于1米

图1中为一条矩形的道路,中间的虚线代表中线。图2为最小覆盖的示意图。

 

输入
输入包括多组测试数据
第一部分:一个整数T(1<=T<=500)
第二部分:一共T行,每行包括三个整数L,D,R代表路的长,宽和覆盖半径(米)。
(1<=L<=100000),(1<=D<=50),(1<=R<=200)。
输出
对于每组测试数据输出各占一行,只有一个整数,表示最少的路由器数量。如果不能覆盖,请输出impossible
样例输入
2
40 6 5
40 10 5
样例输出
5

impossible

思路:这道题只要将d,r,l,看成float输出就会容易很多
#include<math.h>
int main(void)
{
	float t,l,d,r,n;
	scanf("%f",&t);
	while(t--&&scanf("%f%f%f",&l,&d,&r))
	{
		int k;
		if(r*2<=d||r<=1)
			printf("impossible\n");
		else
		{
			n=l/(2*sqrt(r*r-((d*d/4))));
			if(n==(int)n){			
				k=(int)n;}
			else
				k=(int)n+1;
			printf("%d\n",k);
		}
	}
}

16进制的简单运算

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述
现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结果。
输入
第一行输入一个正整数T(0<T<100000)
接下来有T行,每行输入一个字符串s(长度小于15)字符串中有两个数和一个加号或者一个减号,且表达式合法并且所有运算的数都小于31位
输出
每个表达式输出占一行,输出表达式8进制的结果。
样例输入
3
29+4823
18be+6784
4ae1-3d6c
样例输出
44114
100102
6565


这道题放在这里主要想提醒下c语言自带十六进制和八进制转化

#include<stdio.h>//nyoj244
int main(void)
{
	int n;
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		int a,b;
		char c;
		scanf("%x%c%x",&a,&c,&b);
		if(c=='+')
		printf("%o\n",a+b);
		if(c=='-')
		printf("%o\n",a-b);
	}
}

阶乘因式分解(一)

时间限制: 3000  ms  |  内存限制: 65535  KB
难度: 2
描述

给定两个数m,n,其中m是一个素数。

将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m。

输入
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。
输出
输出m的个数。
样例输入
2
100 5
16 2
样例输出
24
15

思路:可以将n的阶层看作m*!(n/m),则可得到n/m个数,再看成m*!(n/m/m),直到n<m

#include<stdio.h>
int main(void)
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m,sum=0;
		scanf("%d%d",&n,&m);
		while(n>=m)
		{
			sum+=n/m;
			n=n/m;
		}
		printf("%d\n",sum);
	}
}

猜你喜欢

转载自blog.csdn.net/printfxgd/article/details/80156055