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