C++ example

  • 格式:doc
  • 大小:76.00 KB
  • 文档页数:10

P1113:求方程 ax + by + cz = s 的正整数解

输入格式:一行四个数,表示 a b c s

输出格式:一个数,表示满足方程的 x y z 的正整数解的组数

输入样例:5 2 7 30

输出样例:4

#include

using namespace std;

int main(){

int x,s,y,z,a,b,c,ans=0;

cin>>a>>b>>c>>s;

for(x=1;x<=s/a;x++)

for(y=1;y<=(s-a*x)/b;y++){

z=(s-a*x-b*y)/c;

if(z>0&&a*x+b*y+c*z==s) ans++;

}

cout<

return 0;

}

P1114:面包店有三种面包,价格分别为 a b c 元,班长准备用班费 s 元去购买面包,他想在三种面包都买到同时又恰好花完 s 元的前提下使购得的面包只数最多。

输入檔:四个正整数 s a b c

输出檔:一个数,表示能购到三种面包又恰好用去 s 元时购得的最多面包数

输入样例:50 5 3 7

输出样例:14

#include

using namespace std;

int main(){

int x,s,y,z,a,b,c,ans=0;

cin>>s>>a>>b>>c;

for(x=1;x<=s/a;x++)

for(y=1;y<=(s-a*x)/b;y++){

z=(s-a*x-b*y)/c;

if(z>0&&a*x+b*y+c*z==s&&x+y+z>ans) ans=x+y+z;

}

cout<

return 0;

}

P1116:统计区间 [a,b] 中有多少个数,满足各位数字和是 x ,各位数字积是 y 。

输入格式:一行四个数 a b x y

输出格式:一个数

输入样例:35 2000 12 36

输出样例:7

#include

using namespace std;

int sum(int x){

int y=0;

while(x>0){ y+=x%10;

x/=10;

}

return y;

}

int mul(int x){

int y=1;

while(x>0){

y*=x%10;

x/=10;

}

return y;

}

int main(){

int a,b,x,y,ans=0,i;

cin>>a>>b>>x>>y;

for(i=a;i<=b;i++)

if(sum(i)==x&&mul(i)==y)ans++;

cout<

return 0;

}

P1118:第一项为 0 ,第二项为 1 ,以后每项是其前二项之和,

这样的数列称为“斐波那契数列”,

即:0 1 1 2 3 5 8 13 21 34 55 89 144 ……

输入格式:一个整数 n ( 3 ≤ n ≤ 100 )

输出格式:一行 n 个斐波那契数(数与数间空一格,最后一个后要换行)

输入样例:10

输出样例:0 1 1 2 3 5 8 13 21 34

#include

using namespace std;

int main(){

int n,i,a[101]={0,0,1};

a[0]=0;

a[1]=0;

a[2]=1;

cin >> n;

for(i=3; i<=n; i++)

a[i]=a[i-2]+a[i-1];

for(i=1;i<=n;i++)

cout << a[i] << (i

return 0;

}

P1137:一迭牌从上到下牌面值依次为 1 ~ n ,每次洗牌是从上往下数第 p 张牌开始的连续 c 张牌,抽出来放到顶上,就像图所示那样。

输入檔:第一行二个数 n k

( 3 ≤ n ≤ 50 ,1 ≤ k ≤ 50 ,k 表示洗牌次数 )

接下来 k 行,每行二个数 p c

表示从 p 开始向下连续的 c 张被抽出,放到顶上。

输出檔:一行 n 个数,表示洗完后从上到下各张牌的牌面值。

样例输入:10 3 ( 10 张牌,洗 3 次 )

5 3 ( 从第 5 张起的连续 3 张牌,抽出后放到上面 )

7 4 ( 从第 7 张起的连续 4 张牌,抽出后放到上面 )

3 6 ( 从第 3 张起的连续 6 张,抽出后放到上面 )

样例输出:9 10 5 6 7 1 4 8 2 3

#include

using namespace std;

int main(){

int n,k,p,c,a[51],b[51],j,i;

cin >> n >> k;

for(i=1; i<=n; i++) a[i]=i;

for(i=1; i<=k; i++) {

cin>>p>>c;

for(j=1; j<=c; j++) b[j]=a[p-1+j];

for(j=1; j

for(j=1; j

}

for(i=1;i<=n;i++)

cout << a[i] <<(i

return 0;

}

P1142:对于任意大于 6 的偶数,均可表示为二个质数之和的算式。

如: 34 可以表示为 34=5+29 。

输入檔:一个大于 6 的偶数

输出檔:若干行质数加式,加式中小质数在前,大质数在后

同类式如 34=5+29 和 34=29+5 ,仅输出 34=5+29 即可

输入样例:34

输出样例:34=3+31

34=5+29

34=11+23 34=17+17

#include

#include

using namespace std;

bool prime(int x)

{

for(int i=2; i<=sqrt(x); i++)

if(x%i==0) return 0;

return 1;

}

int main() {

int n,i;

cin >> n;

for(i=2; i<=n/2; i++)

if(prime(i) && prime(n-i))

printf("%d=%d+%d\n",n,i,n-i);

return 0;

}

P1138:学校水房有 m 个龙头供同学们打开水,每个龙头每秒钟供水量均为 1 。按排队顺序编为 1 到 n 号的同学依次接水,i 号同学的接水量为 w[i] 。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某个水龙头完成后,下一名排队等候接水的同学马上接替开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。问所有同学都接完水需要多少秒。

输入:第一行二个数 n m ( n ≤ 10000 ,1 ≤ m ≤ 100 ,m ≤ n )

第二行 n 个数分别表示各位同学的接水量( Wi ≤ 100 )

输出:一个数,表示所有同学接完水的总时间

输入样例一:5 3

4 4 1 2 1

输出样例一:4

输入样例二:8 4

23 71 87 32 70 93 80 76

输出样例二:163

#include

#include

using namespace std;

int main() {

int n,m,i,j,k,x,a[101];

cin>>n>>m;

for(i=1;i<=m;i++)cin>>a[i];

for(i=m+1;i<=n;i++){

cin>>x;

k=1;

for(j=2;j<=m;j++)

if(a[j]

a[k]+=x;

}

k=1;

for(j=2;j<=m;j++) if(a[j]>a[k]) k=j;

cout<

return 0;

}

P1127:n 个人依次编号为 1、2、…… 、n 围坐成一个圈。从编号是 1 的人开始报数,数到第 m 个人出列,然后从出列的下一个人重新开始报数,数到第 m 个人又出列,……,如此反复直到所有的人全部出列为止。

输入格式:二个数 n m

输出格式:依次出圈的数,数之间有一空格。

输入样例:6 5

输出样例:5 4 6 2 3 1

#include

#include

using namespace std;

int main() {

int i,k,n,m,p=0,s=0,a[1001];

cin>>n>>m;

for(i=1;i<=n;i++)a[i]=1;

k=n;

while(k>0){

p=p%n+1;

s+=a[p];

if(s==m){

cout<1?" ":"\n");

a[p]=0;

k--;

s=0;

}

}

return 0;

}

P1128:输入 n 个数,输出它们按从小到大的排序结果。

输入格式:第一行,一个数 n ( 1 ≤ n ≤ 1000 )

第二行,n 个用空格隔开的整数

输出檔:一行 n 个从小到大排列的数,数之间用一空格隔开。

输入样例:10

3 6 9 10 2 5 8 1 4 7

输出样例:1 2 3 4 5 6 7 8 9 10

#include

#include

#include

#include

#include

using namespace std;

int main() {

int n,i,a[1001];

cin>>n;

for(i=1;i<=n;i++)cin>>a[i];