算法学习日记(三)

##蓝桥杯刷题(第五届省赛)

输入一个字符串,求它包含多少个单词。单词间以一个或者多个空格分开。
第一个单词前,最后一个单词后也可能有0到多个空格。
比如:" abc xyz" 包含两个单词,"ab c xyz " 包含3个单词。

如下的程序解决了这个问题,请填写划线部分缺失的代码。

注意:只填写划线部分的代码,不要填写任何多余的内容。比如已经存在的小括号,注释或说明文字等。


int get_word_num(char* buf)
{
int n = 0;
int tag = 1;
char* p = buf;

for(;*p!=0 && *p!=13 && *p!=10;p++){
	if(*p==' ' && tag==0) tag=1;
	if( _____________________ ) { n++; tag=0; }   //填空
}

return n;

}

int main()
{
char buf[1000];
fgets(buf,1000,stdin);

printf("%d\n", get_word_num(buf));
return 0;

}

ans:	if(*p!=' '&&tag==1 ) { n++; tag=0; } 

1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。

它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。

但是,它发散的很慢:

前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0

那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?

请填写这个整数。

注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。


#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
float sum=0,k;
int num=0;
for( k=1;;k++)
{
sum+=1/k;
num++;
if(num%1000==0)
cout<<sum<<" "<<num<<endl;
if(sum>=15.0)
break;
}
cout<<num<<endl;

return 0;
}
  • tips 用double而不用flaot 精度问题 另外注意一致性 赋值给double和flaot的数用xxx.0这样子

如果x的x次幂结果为10(参见【图1.png】),你能计算出x的近似值吗?

显然,这个值是介于2和3之间的一个数字。

请把x的值计算到小数后6位(四舍五入),并填写这个小数值。

注意:只填写一个小数,不要写任何多余的符号或说明。

#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;

int main()
{
double x=0.0;
for(x=2.0;;x+=0.0000001)
{
	if(abs(10-pow(x,x))<=0.00001&&pow(x,x)<10)
	{
		break;
	}
		
}

printf("%.7lf",x);
return 0;
}

ans:2.506184

今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。

#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
int ok=1;	
char s[]="74112233455667";
do{
ok=1;
if(s[0]!='7'||s[1]!='4'||s[6]!='4'||s[8]!='7')
{
ok=0;
}
/*if(ok)
{
	cout<<s<<endl;
}*/
for(int i=0;i<14;i++)
{
if(s[i]=='1')
{
if(s[i+2]!='1'&&s[i-2]!='1')
ok=0;
}
if(s[i]=='2')
{
if(s[i+3]!='2'&&s[i-3]!='2')		
ok=0;	
}
if(s[i]=='3')
{
if(s[i+4]!='3'&&s[i-4]!='3')		
ok=0;	
}
if(s[i]=='4')
{
if(s[i+5]!='4'&&s[i-5]!='4')		
ok=0;	
}
if(s[i]=='5')
{
if(s[i+6]!='5'&&s[i-6]!='5')		
ok=0;	
}
if(s[i]=='6')
{
	
if(s[i+7]!='6'&&s[i-7]!='6')		
ok=0;	
}

}

if(ok)
{
cout<<s<<endl;
}	
	
}while(next_permutation(s,s+14)); 


return 0;
}



勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。

已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。

求满足这个条件的不同直角三角形的个数。

【数据格式】
输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。

例如,输入:
5
程序应该输出:
1

再例如,输入:
100
程序应该输出:
2

再例如,输入:
3
程序应该输出:
0

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
int n;
int i=0;
int num=0;

cin>>n;
for (i=1;i<n;i++)
{
	
	for(int j=1;j<n;j++)
{	
	if(pow(n,2)==pow(i,2)+pow(j,2))
		
	{
		num++;
	}
	
}


}
cout<<num/2;

return 0;
}



你一定听说过“数独”游戏。
如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。

例如:
输入(即图中题目):
005300000
8000000202
070010500
400005300
010070006
003200080
060500009
004000030
000009700

程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764

再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400

程序应该输出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
int map[9][9];
void show()
{
for(int i=0;i<9;i++)
{
 
for(int j=0;j<9;j++)
{ 
cout<<map[i][j];
}
cout<<endl; 
}	
	
	
}
bool check(int x,int y, int k)
{
	for(int i=0;i<9;i++)
	{
		if(map[i][y]==k||map[x][i]==k)
		return false;
	
	}
	int dx=x/3;
	int dy=y/3;
	for(int i=dx*3;i<=dx*3+2;i++)
	{
		for(int j=dy*3;j<=dy*3+2;j++)
		{
			if(map[i][j]==k)
			return false; 
		}
	}
	return true;
	
}
void dfs(int n)
{

if(n==81)
{
	cout<<endl;
	show();
	return ;
}
int x=n/9;
int y=n%9;
if(map[x][y]==0)
{
	for(int k=1;k<=9;k++)
	{
		if(check(x,y,k))
	{
		map[x][y]=k;
		dfs(n+1);
		map[x][y]=0;	
	}		
	
	}
	return ;
	
}
else
{
	dfs(n+1);
}



}
int main()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
scanf("%01d",&map[i][j]);
}
}
dfs(0);

return 0;
}



奖券数目

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

请提交该数字(一个整数),不要写任何多余的内容或说明性文字。

#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;

int main()
{
int num=0;
char *s=new char [6];
for(int i=10000;i<=99999;i++)
{
sprintf(s,"%d",i);

int ok=1;
for(int i=0;i<5;i++)
{
	if(s[i]=='4')
{
	ok=0;
}
} 
if(ok)
{
	num++;
}	
	

	
	
}

cout<<num;
return 0;
}



移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:

1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 …

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。

例如:
用户输入:
6 8 2
则,程序应该输出:
4

再例如:
用户输入:
4 7 20
则,程序应该输出:
5

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。


#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;

int main()
{
int w,m,n;
cin>>w>>m>>n;
int row=10000/w;
int **a=new int*[row];
for(int i=0;i<row;i++)
{
a[i]=new int[w];
}
int num=1;
/*int row=m/w;
int col=m%w-1;*/
for(int i=0;i<row;i++)
{
	for(int j=0;j<w;j++)
	{
		if(i%2==0)
	{
	
		a[i][j]=num++;
	}
	else
	{
		
		a[i][w-j-1]=num++;
		
	}
	
	
	}
	
	
}
int x1,x2,y1,y2; 
for(int i=0;i<row;i++)
{
	for(int j=0;j<w;j++)
	{
		
	if(a[i][j]==m)
	{
	
	 x1=i;
	y1=j;	

}
if(a[i][j]==n)
{
	 x2=i;
	 y2=j;
	
	
}



	}
	
}
int ans=abs(x2-x1)+abs(y2-y1);
cout<<ans;
for(int i=0;i<row;i++)
delete []a[i];

return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值