C++编程题,关于数据结构的.急用。。。
发布网友
发布时间:2023-04-29 13:54
我来回答
共3个回答
热心网友
时间:2023-11-03 11:10
基本约瑟夫问题:m个人围成一圈,隔k退出圈子,直到只胜一个人
基本解法:1.循环队列的模拟
2.递推,记f[m,k]为m个人,间隔k时候的最后一个人在最初的编号(从0编号)
容易得到递推式子f[1,k]=0;f[m,k]=(f[m-1,k]+k)%m
下面是我写的高精 + - * / 都有
#include <string>
#include <cstdlib>
using namespace std;
const int maxn=1005;
struct item{
int s[maxn],L;
item(){
L=1;memset(s,0,sizeof(s));
}
item(char *S){
L=strlen(S);
for(int i=1;i<=L;++i)
s[i]=S[L-i]-'0';
}
void init(){
char S[maxn];
gets(S);L=strlen(S);
for(int i=1;i<=L;++i)
s[i]=S[L-i]-'0';
}
void out(){
for(int i=L;i>=1;--i)
printf("%i",s[i]);
printf("\n");
}
};
item operator+(item s,int c){
for(int i=1;i<=s.L;++i){
c=s.s[i]+c;
s.s[i]=c%10;
c=c/10;
}
while(c>0){
s.s[++s.L]=c%10;
c=c/10;
}
return s;
}
item operator+(item &a,item &b){
item s;
s.L=max(a.L,b.L);
for(int i=1;i<=s.L;++i)
s.s[i]=a.s[i]+b.s[i];
return s+0;
}
item operator*(item s,int m){
if(m==0)
return item();
for(int i=1;i<=s.L;++i)
s.s[i]=s.s[i]*m;
return s+0;
}
item operator*(item &a,item &b){
item s;
s.L=a.L+b.L-1;
for(int i=1;i<=a.L;++i)
for(int j=1;j<=b.L;++j)
s.s[i+j-1]+=a.s[i]*b.s[j];
return s+0;
}
bool operator>(item &a,item &b){
int L=max(a.L,b.L);
for(int i=L;i>=1;--i)
if(a.s[i]>b.s[i])
return true;
else if(a.s[i]<b.s[i])
return false;
return false;
}
bool operator>=(item &a,item &b){
int L=max(a.L,b.L);
for(int i=L;i>=1;--i)
if(a.s[i]>b.s[i])
return true;
else if(a.s[i]<b.s[i])
return false;
return true;
}
item operator-(item s,int b){
for(int i=1;i<=s.L;++i){
b=s.s[i]-b;b=-b;
int x=(9+b)/10;
s.s[i]=10*x-b;
b=x;
}
while(s.L>1&&s.s[s.L]==0)--s.L;
return s;
}
item operator-(item &a,item &b){
item s;
s.L=a.L;
for(int i=1;i<=s.L;++i)
s.s[i]=a.s[i]-b.s[i];
return s-0;
}
item div(item m,int n,int &d){
for(int i=m.L;i>=1;--i){
d=d*10+m.s[i];
m.s[i]=d/n;
d=d%n;
}
while(m.L>1&&m.s[m.L]==0)--m.L;
return m;
}
item div(item a,item b,item &d){
for(int i=a.L;i>=1;--i){
d=d*10;
d=d+a.s[i];
item data;
int j;
for(j=1;j<=10;++j){
data=data+b;
if(data>d)break;
}
data=data-b;
d=d-data;
a.s[i]=j-1;
}
while(a.L>1&&a.s[a.L]==0)--a.L;
return a;
}
int main(){
item a,b,d;
a.init();
b.init();
div(a,b,d).out();
d.out();
system("pause");
return 0;
}
热心网友
时间:2023-11-03 11:10
找一本数据结构的习题书,里面有很多的
热心网友
时间:2023-11-03 11:11
课程设计吧- -
热心网友
时间:2023-11-03 11:10
基本约瑟夫问题:m个人围成一圈,隔k退出圈子,直到只胜一个人
基本解法:1.循环队列的模拟
2.递推,记f[m,k]为m个人,间隔k时候的最后一个人在最初的编号(从0编号)
容易得到递推式子f[1,k]=0;f[m,k]=(f[m-1,k]+k)%m
下面是我写的高精 + - * / 都有
#include <string>
#include <cstdlib>
using namespace std;
const int maxn=1005;
struct item{
int s[maxn],L;
item(){
L=1;memset(s,0,sizeof(s));
}
item(char *S){
L=strlen(S);
for(int i=1;i<=L;++i)
s[i]=S[L-i]-'0';
}
void init(){
char S[maxn];
gets(S);L=strlen(S);
for(int i=1;i<=L;++i)
s[i]=S[L-i]-'0';
}
void out(){
for(int i=L;i>=1;--i)
printf("%i",s[i]);
printf("\n");
}
};
item operator+(item s,int c){
for(int i=1;i<=s.L;++i){
c=s.s[i]+c;
s.s[i]=c%10;
c=c/10;
}
while(c>0){
s.s[++s.L]=c%10;
c=c/10;
}
return s;
}
item operator+(item &a,item &b){
item s;
s.L=max(a.L,b.L);
for(int i=1;i<=s.L;++i)
s.s[i]=a.s[i]+b.s[i];
return s+0;
}
item operator*(item s,int m){
if(m==0)
return item();
for(int i=1;i<=s.L;++i)
s.s[i]=s.s[i]*m;
return s+0;
}
item operator*(item &a,item &b){
item s;
s.L=a.L+b.L-1;
for(int i=1;i<=a.L;++i)
for(int j=1;j<=b.L;++j)
s.s[i+j-1]+=a.s[i]*b.s[j];
return s+0;
}
bool operator>(item &a,item &b){
int L=max(a.L,b.L);
for(int i=L;i>=1;--i)
if(a.s[i]>b.s[i])
return true;
else if(a.s[i]<b.s[i])
return false;
return false;
}
bool operator>=(item &a,item &b){
int L=max(a.L,b.L);
for(int i=L;i>=1;--i)
if(a.s[i]>b.s[i])
return true;
else if(a.s[i]<b.s[i])
return false;
return true;
}
item operator-(item s,int b){
for(int i=1;i<=s.L;++i){
b=s.s[i]-b;b=-b;
int x=(9+b)/10;
s.s[i]=10*x-b;
b=x;
}
while(s.L>1&&s.s[s.L]==0)--s.L;
return s;
}
item operator-(item &a,item &b){
item s;
s.L=a.L;
for(int i=1;i<=s.L;++i)
s.s[i]=a.s[i]-b.s[i];
return s-0;
}
item div(item m,int n,int &d){
for(int i=m.L;i>=1;--i){
d=d*10+m.s[i];
m.s[i]=d/n;
d=d%n;
}
while(m.L>1&&m.s[m.L]==0)--m.L;
return m;
}
item div(item a,item b,item &d){
for(int i=a.L;i>=1;--i){
d=d*10;
d=d+a.s[i];
item data;
int j;
for(j=1;j<=10;++j){
data=data+b;
if(data>d)break;
}
data=data-b;
d=d-data;
a.s[i]=j-1;
}
while(a.L>1&&a.s[a.L]==0)--a.L;
return a;
}
int main(){
item a,b,d;
a.init();
b.init();
div(a,b,d).out();
d.out();
system("pause");
return 0;
}
热心网友
时间:2023-11-03 11:10
找一本数据结构的习题书,里面有很多的
热心网友
时间:2023-11-03 11:11
课程设计吧- -