Problem A: 深入浅出学算法002-n个1
Description
由n个1组成的整数能被K(K<10000)整除,n至少为多少?
Input
多组测试数据,第一行输入整数T,表示组数 然后是T行,每行输入1个整数代表K
Output
对于每组测试数据输出1行,值为n
Sample Input
1
11
Sample Output
2
#include<iostream>
using namespace std;
int main()
{
int t,k,temp,count,ys;
while(cin>>t)
{
while(t--)
{
temp=1;count=1;
cin>>k;
temp%=k;
while(temp!=0)
{
temp=temp*10+1;
temp%=k;
count++;
}
cout<<count<<endl;
}
}
return 0;
}
Problem B: 深入浅出学算法003-计算复杂度
Description
算法复杂度一般分为:时间复杂度、空间复杂度、编程复杂度。 这三个复杂度本身是矛盾体,不能一味地追求降低某一复杂度,否则会带来其他复杂度的增加。在权衡各方面的情况下,降低时间复杂度成为本课程学习的重点之一。 请计算下面几个程序段的复杂程度,分别用1、logn、n、nlogn、n2、n3或2^n来表示
程序片段1:
x=x+1;
程序片段2:
for(k=1;k<=n;k++)
{
x=x+1;
}
程序片段3: for(k=1,t=1;k<=n;k++) { t=t*2; for(j=1;j<=t;j++) x=x+j; }
程序片段4: for(k=1;k<=n;k++) { for(j=1;j<=k;j++) x=x+j; }
程序片段5: m=0; for(k=1,t=1;k<=n;k++) { t=t*2; for(j=t;j<=n;j++) m++; }
程序片段6: m=0; for(k=1;k<=n;k++) { for(j=1;j<=n;j++) m++; }
程序片段7: m=0; for(k=1;k<=n;k++) { for(j=1;j<=n;j++) for(i=1;i<=n;i++) m++; }
Input
多组测试数据,首先在第一行输入整数T表示提问次数 然后是n行,每行是1个整数,表示程序片段号
Output
对于每次提问,在1行输出对应程序片段对应的复杂程度(注意必须按前面提示的输出,注意大小写
Sample Input
2
1
2
Sample Output
1
n
说几句
复杂度这个东西嘛。。说难可能有一点 说简单也简单
就是外圈乘上内圈
代码实现
#include<iostream>
using namespace std;
int main()
{
int n,a;
while(cin>>n)
while(n--)
{
cin>>a;
switch(a)
{
case 1:
cout<<1<<endl;
break;
case 2:
cout<<"n"<<endl;
break;
case 3:
cout<<"2^n"<<endl;
break;
case 4:
cout<<"n^2"<<endl;
break;
case 5:
cout<<"nlogn"<<endl;
break;
case 6:
cout<<"n^2"<<endl;
break;
case 7:
cout<<"n^3"<<endl;
break;
}
}
return 0;
}
Problem C: 深入浅出学算法004-求多个数的最小公倍数
Description
求n个整数的最小公倍数
Input
多组测试数据,先输入整数T表示组数 然后每行先输入1个整数n,后面输入n个整数k1 k2…kn
Output
求k1 k2 …kn的最小公倍数
Sample Input
1
3 12 18 6
Sample Output
36
说几句
这道题真的做到我自闭了 对不起 是我太菜
可以说错在两个点吧
一
自定义函数的时候千万不能直接sum=a*b
这样数据很大会直接爆掉 unsigned long long都救不回来
可以先 a/最大公约数 再乘b
二
这里ans刚开始=a[1] 然后从2开始自定义函数就没有问题
但是刚开始赋值ans=gbs(a[1],a[2]) 然后再从3开始就会wa
然后我就被教育了
我太sb了
刚开始加个a[2]=1 测试以下就行 真的ac了
我真的太sb了
太菜了我
ac代码
#include<stdio.h>
int gbs(int a,int b)
{
int r=1,x=a,y=b;
while(r!=0)
{
r=a%b;
a=b;
b=r;
}
return x/a*y;
}
int main()
{
int t,n,i,a[100000],ans;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
ans=a[1];
for(i=2;i<=n;i++)
ans=gbs(ans,a[i]);
printf("%d\n",ans);
}
}
return 0;
}
Problem D: 深入浅出学算法005-数7
Description
逢年过节,三五好友,相约小聚,酒过三旬,围桌数七。 “数七”是一个酒桌上玩的小游戏。就是按照顺序,某人报一个10以下的数字,然后后面的人依次在原来的数字上加1,并喊出来,当然如果要喊的数包含7或者是7的倍数,那么不能直接喊,可以敲一下筷子,否则就算输,要罚酒一杯。
Input
多组测试数据,先输入整数T表示组数, 每组测试数据输入一个10以下的正整数,
Output
对于每组测试数据,输出在一行,要求从小到大输出所报数(含)到100之间所有不能喊的数字
Sample Input
1
3
Sample Output
7 14 17 21 27 28…
今天写题异常不顺 水题wa了好多 这题最后没输出换行也wa了一次
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int t,n,i,count;
while(cin>>t)
while(t--)
{
cin>>n;count=1;
for(i=n;i<100;i++)
if(i%7==0 || i%10==7 || i/10==7)
if(count==1) {cout<<i;count++;}
else {cout<<" "<<i;}
cout<<endl;
}
return 0;
}
Problem E: 深入浅出学算法006-求不定方程的所有解
Description
现有一方程ax+by=c,其中系数a、b、c均为整数,求符合条件的所有正整数解,要求按x由小到大排列,其中a b c 均为不大于1000的正整数
Input
多组测试数据,第一行先输入整数T表示组数 然后每组输入3个整数分别表示a b c
Output
对于每组数据按要求输出所有正整数解 有多个解的情况下,每对解一行,要求按照x从小到大输出 无解时输出No
Sample Input
1
1 2 3
Sample Output
1 1
代码
今晚真的不在状态 每题交上去必wa一次
反正别忘了没有输出就输出No就行了
#include<iostream>
using namespace std;
int main()
{
int t,a,b,c,i,j,flag;
while(cin>>t)
while(t--)
{
cin>>a>>b>>c;flag=0;
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
if(a*i+b*j==c)
{cout<<i<<" "<<j<<endl;flag=1;}
if(!flag) cout<<"No"<<endl;
}
return 0;
}
Problem F: 深入浅出学算法007-统计求和
Description
求含有数字a且不能被a整除的4位整数的个数,并求这些整数的和
Input
多组测试数据,先输入整数T表示组数然后每组输入1个整数a(1<=a<=9)
Output
对于每组测试数据输出一行,每行2个数分别是个数与和
Sample Input
1
3
Sample Output
2112 10568016
终于出现一次a的水题了 太感动了
#include<iostream>
using namespace std;
int main()
{
int t,a,i,count;
long long sum;
while(cin>>t)
while(t--)
{
cin>>a;sum=0;count=0;
for(i=1000;i<=9999;i++)
if((i%10==a || i/10%10==a || i/100%10==a || i/1000==a) && i%a!=0)
{sum+=i;count++;}
cout<<count<<" "<<sum<<endl;
}
return 0;
}
Problem G: 深入浅出学算法008-求佩尔方程的解
Description
标题
求关于x y的二次不定方程的解 x2-ny2=1
Input
多组输入数据,先输入组数T 然后输入正整数n(n<=100)
Output
对于每组数据输出一行,求y<=10000的最小正整数解 ,输出y的值,如果在此范围内没有解则输出No
Sample Input
1
73
Sample Output
No
就看看n*y^2+1是不是一个数的平方
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int t,n,a,pd,x,y;
while(cin>>t)
{
while(t--)
{
pd=0;
cin>>n;
for(y=1;y<=10000;y++)
{
a=n*y*y;
x=floor(sqrt(a+1)+0.5);
if(x*x==a+1)
{
pd++;
cout<<y<<endl;
break;
}
}
if(pd==0)
cout<<"No"<<endl;
}
}
return 0;
}
Problem H: 深入浅出学算法009-韩信点兵
标准题解
但是提交好像没什么反应QAQ