D::::::::::::::::::数数(思维)
问题描述
任何一个大于 1 的正整数都能被分解为若干个质数相乘, 比如 28=2×2×7 被分解为了三个质数相乘。请问在区间 [2333333, 23333333] 中有多少个正整数 可以被分解为 12 个质数相乘?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
运行限制
最大运行时间:1s
最大运行内存: 512M
上千万的数据量,不可能12个循环吧
#include <iostream> #include <vector> using namespace std; int ans; bool sushu(int x){ if(x==1){ return false; } if(x==2){ return true; } for(int i=2;i*i<=x;i++){ if(x%i==0){ return false; } } return true; } int su[23333339]; vector<int> p; int main(){ long long a=2333333; long long b=23333333; for(int i=2;i<=b;i++){ if(!su[i]&&sushu(i)){ su[i]=1; //su[i]=1,代表i由一个数的值 p.push_back(i); //素数压入动态数组 } if(i>=a&&su[i]==12){ //判断是否是12个数的乘积 ans++; } //当i==a时,p中是2到a的所有素数 for(vector<int>::iterator it=p.begin();it!=p.end();it++){ if(i* *it>b){ break; }else{ su[i* *it]=su[i]+1; //i* *it两个乘积,再i的基础上乘以*it,所以值加一; } } } cout<<ans; return 0; }
半分钟出答案,还是慢点,填空题无所谓了
E::::::::::::::::::约瑟夫杯(队列,循环列表)
题目描述
设有 nn 个人围坐在圆桌周围,现从某个位置 kk 上的人开始报数,报数到 m 的人就站出来。下一个人,即原来的第 m+1 个位置上的人,又从 11 开始报数,再报数到 m 的人站出来。依次重复下去,直到全部的人都站出来为止。试设计一个程序求出这 n 个人的出列顺序。
要求一:采用循环链表解决。
要求二:可以使用模拟法,模拟循环链表。
要求三:可以不使用循环链表类的定义使用方式。
输入描述
输入只有一行且为用空格隔开的三个正整数 n,k,m,其含义如上所述。
输出描述
共 n 行,表示这 n 个人的出列顺序。
输入输出样例
示例 1
输入
3 5 8
输出
3 2 1
队列方法:
#include <iostream> #include <queue> using namespace std; queue<int> q; int n,k,m; //n个人,k开始,m出 int main(){ cin>>n>>k>>m; k=k%n; for(int i=k;i<=n;i++){ q.push(i); } for(int i=1;i<k;i++){ q.push(i); } while(!q.empty()){ for(int i=1;i<m;i++){ int c=q.front(); q.pop(); q.push(c); } int c=q.front(); cout<<c<<endl; q.pop(); } return 0; }
循环链表方法:
#include <iostream> using namespace std; typedef struct node { int data; struct node* next; }LNode, *Linklist; void initlink(Linklist &head, int n) { head = new LNode; LNode * p = head; p->data = 1; for (int i = 2; i <= n; i++) { p->next = new LNode; p = p->next; p->data = i; } p->next = head; } void baoshu(Linklist &head, int k, int m) { LNode *p = head; for (int i = 1; i < k; i++) p = p->next; while (p->next != p) { for (int j = 1; j < m - 1; j++) p = p->next; cout << p->next->data << endl; p->next = p->next->next; p = p->next; } cout << p->data; } int main() { int n, k, m; cin >> n >> k >> m; Linklist head; initlink(head, n); baoshu(head, k, m); }
F::::::::::::::::::移动字母(DFS,BFS)
题目描述
2x3=6 个方格中放入 ABCDE 五个字母,右下角的那个格空着。如下图所示。
和空格子相邻的格子中的字母可以移动到空格中,比如,图中的 C 和 E 就可以移动,移动后的局面分别是:
A B
D E C
A B C
D E
为了表示方便,我们把 6 个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:
AB*DEC
ABCD*E
题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出 1,否则输出 0。初始状态为:ABCDE*。
输入描述
先是一个整数 nn,表示接下来有 nn 行状态。
输出描述
程序输出 nn 行 1 或 0。
输入输出样例
示例
输入
7 BCDEA* DAECB* ECABD* BCDAE* DAEBC* ECADB* EDCAB*
输出
1 1 1 0 0 0 0
#include <iostream> #include <map> using namespace std; int n; string a[2]; string b[2]; int bb[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; bool res; map<string,bool> vis; bool check1(){ for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ if(a[i][j]!=b[i][j]){ return false; } } } return true; } bool check2(int x,int y){ return x>=0&&x<2&&y>=0&&y<3; } void dfs(int x,int y){ if(res){ return; } if(check1()){ res=true; return; } for(int i=0;i<4;i++){ int tx=x+bb[i][0]; int ty=y+bb[i][1]; if(check2(tx,ty) ){ char c=a[x][y]; a[x][y]=a[tx][ty]; a[tx][ty]=c; if(!vis[a[0]+a[1]]) { vis[a[0]+a[1]]=1; dfs(tx,ty); } c=a[x][y]; a[x][y]=a[tx][ty]; a[tx][ty]=c; } } } int main(){ cin>>n; for(int i=0;i<n;i++){ a[0]="ABC"; a[1]="DE*"; for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ cin>>b[i][j]; } } res=false; vis.clear(); dfs(1,2); if(res){ cout<<1<<endl; }else{ cout<<0<<endl; } } return 0; }