1.标题:切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
找规律啊找规律 没想到 对折3次发现是9 , 就是2 3 5 9找规律 还是要坚定自己能做出来吧
#include <bits/stdc++.h>
using namespace std;
int a[12];
int main(){
a[0]=2; //不对折
a[1]=3; //对折1次
a[2]=5; //对折2次
for(int i=3;i<=10;i++)
a[i]=a[i-1]*2-1;
cout<<a[10];
return 0;
}
2.X的x次幂
如果x的x次幂结果为10,你能计算出x的近似值吗?
显然,这个值是介于2和3之间的一个数字。
请把x的值计算到小数后6位(四舍五入),并填写这个小数值。
注意:只填写一个小数,不要写任何多余的符号或说明。
这个题一看感觉很复杂,没想到这么简单,还是练习太少了。然后是学长提到的,pow函数精准度不够,出来的小数+0.000001/-0.000001试一下 这个程序运行出来时2.506185 计算器算得10.000016(保留6位小数四舍五入),2.506184得出9.999997,2.506186必然比2.506185得出的数还大不必再算,如此可知答案是2.506184.
#include <bits/stdc++.h>
using namespace std;
int main(){
double i;
for(i=2;i<=3;i+=0.000001){
if((double)pow(i,i)>=10)
break;
}
printf("%0.6lf",i);
return 0;
}
3.计算质因子
题目描述
输入一个整数,输出其所有质因子。
数据规模和约定
1< =n< =10000
输入
输入只有一行,包含一个整数n。
输出
输出一行,包含若干个整数,为n的所有质因子,按照从小到大的顺序排列
样例输入
6
样例输出
2 3
我的天哪是质因子质因子质质因子啊……我还算出来因子三次提交不过我还想这什么问题 结果人家首先要满足质数的条件 还是要看清楚题啊
#include <bits/stdc++.h>
using namespace std;
int a[10000];
int judge(int n){
if(n==1)
return 0; //不是素数
for(int i=2;i*i<=n;i++){
if(n%i==0)
return 0; //不是素数
}
return 1; //是素数
}
int main(){
int x;
cin>>x;
int cnt=0;
for(int i=2;i*i<=x;i++)
if(x%i==0){
if(i*i==x){
a[cnt]=i;
cnt++;
}
else{
a[cnt]=i;
a[cnt+1]=x/i;
cnt+=2;
}
}
sort(a,a+cnt);
for(int i=0;i<cnt;i++)
if(judge(a[i])==1)
cout<<a[i]<<" ";
return 0;
}
4.数的划分
一个正整数可以划分为多个正整数的和,比如n=3时:
3;1+2;1+1+1;
共有三种划分方法。
给出一个正整数,问有多少种划分方法。
数据规模和约定
n< =100
输入
一个正整数n
输出
一个正整数,表示划分方案数
样例输入
3
样例输出
3
考虑到是组合,不能出现重复的情况,比如4=3+1与4=1+3是一种,所以采用“划分数中的最大值”来限定重复状态
#include <bits/stdc++.h>
using namespace std;
int dp[1000][1000]; //dp[i][j]表示对i这个数划分最大数字不超过j的划分数
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
dp[0][i]=1; //对0这个数字划分当然最大数字是什么都是一个 0
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i<j) //i<j划分的最大数字只能是i
dp[i][j]=dp[i][i];
else //划分数中含j(最后一个数字为j(前面也可以有))+划分数中不含j
dp[i][j]=dp[i-j][j]+dp[i][j-1];
//前半部分的意思是 i这个数里已经有一个加数是j 那就是求i-j的划分 划分中当然也可以有j
}
cout<<dp[n][n]<<endl;
return 0;
}
5.密文搜索
题目描述
福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
输入
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
输出
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
样例输入
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
样例输出
4
先记下,具体没看
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int main()
{
int n;
char str[1005],s[10];
int a[1005][26],b[26];
memset(a,0,sizeof(a));
scanf("%s", str);
for(int i=0; i<=(strlen(str)-8); i++)
for(int j=i; j<=i+7; j++)
a[i][str[j]-'a']+=1;
scanf("%d",&n);
int sum=0;
for(int k=0; k<n; k++)
{
int flag;
memset(b,0,sizeof(b));
scanf("%s", s);
for(int i=0; i<strlen(s); i++)
b[s[i]-'a']+=1;
for(int i=0; i<=strlen(str)-8; i++)
{
flag=1;
for(int j=0; j<26; j++)
{
if(a[i][j]!=b[j])
{
flag=0;
break;
}
}
if(flag==1)
sum++;
}
}
cout<<sum<<endl;
return 0;
}
6.网络寻路
题目描述
X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
源地址和目标地址可以相同,但中间节点必须不同。
如下图所示的网络。
1 -> 2 -> 3 -> 1 是允许的
1 -> 2 -> 1 -> 2 或者 1 -> 2 -> 3 -> 2 都是非法的。
输入
输入数据的第一行为两个整数N M,分别表示节点个数和连接线路的条数(1< =N< =10000; 0< =M< =100000)。
接下去有M行,每行为两个整数 u 和 v,表示节点u 和 v 联通(1< =u,v< =N , u!=v)。
输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。
输出
输出一个整数,表示满足要求的路径条数。
样例输入
4 4
1 2
2 3
3 1
1 4
样例输出
10
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int head[MAX],tot,n,m;
struct Edge {
int v;
int ne;
} e[MAX];
void add(int u,int v) {
e[++tot].v = v;
e[tot].ne = head[u];
head[u] = tot;
}
int dfs(int u,int fa,int num) {
if(num == 4) return 1;
int res = 0;
for(int i = head[u]; ~i; i = e[i].ne) {
int v = e[i].v;
if(v == fa) continue;
res += dfs(v,u,num+1);
}
return res;
}
int main()
{
cin>>n>>m;
for(int i = 1; i<=n; i++) head[i] = -1;
for(int u,v,i = 1; i<=m; i++) {
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
int ans = 0;
for(int i = 1; i<=n; i++) ans += dfs(i,0,1);
cout << ans << endl;
return 0 ;
}