c++作业(2)

螺旋方阵

题目描述

螺旋方阵

输入

一个整数n(0<n<10)

输出

一个n行方阵,每行n个数,每个数场宽为3

样例输入
5
样例输出
  1  2  3  4  5
 16 17 18 19  6
 15 24 25 20  7
 14 23 22 21  8
 13 12 11 10  9
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int loop = n / 2;
	int a[11][11] = { 0 };
	int startX = 0, startY = 0;
	int num = 1;
    int offset = 1;
    int i, j;
    while (loop--)
    {
        i = startX;
        j = startY;
        for (j = startY; j < startY + n - offset; j++)
            a[startX][j] = num++;
        for (i = startX; i < startX + n - offset; i++)
            a[i][startY + n - offset] = num++;
        for (j = startY + n - offset; j > startY; j--)
            a[startX + n - offset][j] = num++;
        for (i = startX + n - offset; i > startX; i--)
            a[i][startY] = num++;
        startX++;
        startY++;
        offset += 2;
    }
	int mid = n / 2;
	if (n % 2 == 1)
	{
		a[mid][mid] = n * n;
	}
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << setw(3) << a[i][j];
        }
        cout << endl;
    }
	return 0;
}

 我是第几个单词

题目描述

输入一个英文句子,例如:“This is a Book",单词之间以一个空格来分隔。接着再输入一个单词A,请找出首次在句子中出现的与A相同的单词,是句子中的第几个单词,若不存在,则输出该句子中单词字符的总个数。 例如对上句子而言,若输入单词“is”,则应输出:2 若输入单词“isa”,则应输出:11

输入

第一行为以‘.’结束的一个词组(仅由若干个单词组成,单词间由一空格隔开,除单词和最后的“.”以外,不含其它字符)

第二行是一个单词(不含空格)

输出

一个整数

样例输入
This is a Book
Book
样例输出
4
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
	string str1;
	string str2;
	int num1 = 0;
	int word_number = 1;
	int nearest = 9999;
	int num2 = 0;
	getline(cin, str1);
	getline(cin, str2);
	str2 = " " + str2 ;
	int a = str1.find(str2);
	if (a >= 0)
	{
		for (int i = 0; i < str1.size(); i++)
		{
			if (str1[i] == ' ')
			{
				num2++;
				if (abs(i - a) < nearest)
				{
					nearest = abs(i - a);
					if (nearest == 0)
					{
						break;
					}
				}
			}
		}
		cout << num2 + 1;
	}
	else if (a < 0)
	{
		for (int i = 0; i < str1.size(); i++)
		{
			if ((str1[i] > 64 && str1[i] < 91) || (str1[i] > 96 && str1[i] < 123))//ASCII码中字母对应的值
			{
				num1++;
			}
		}
		cout << num1;
	}
	return 0;
}

完全背包

题目描述

有n种物品和一个总重量是W的背包,每种物品都有无限件可用。
第i种物品的重量是wi,价值是vi
求解将哪些物品装入背包,可使这些物品的总重量不超过W,且总价值最大。输出最大价值。

输入

第一行两个整数n和W
接下来n行,每行两个整数wi和vi

输出

一个整数,表示最大价值

样例输入 复制
4 5
1 2
2 4
3 4
4 5
样例输出 复制
10
#include <iostream>
#include <cstdio>
#define N 1100
using namespace std;
int main(){
    int n, m;
    int v[N], w[N];
    int a[N][N];
    
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> v[i] >> w[i];
    for(int i = 1; i <= n; i++){
        for(int j = 0; j <= m; j++){
            for(int k = 0; k <= j/v[i]; k++)
                a[i][j] = max( a[i-1][j], a[i-1][j - k*v[i]] + k*w[i] );
        }
    }
    cout << a[n][m] << endl;
    return 0;
}

 判断正负数或零

输入一个整数,判断它是正数、负数或零。

输入输出要求:

输入的数是正数时,输出该数>0
输入的数是负数时,输出该数<0
输入的数是0时,输出 0=0

样例输入1
5
样例输出1
5>0

样例输入2
-7
样例输出1
-7<0

样例输入3
0
样例输出3
0=0

输入

一个整数n

输出

按题目要求输出判断结果

样例输入 复制
6
样例输出 复制
6>0
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n<0)
    {
        cout<<n<<"<0";
    }
    else if(n>0)
    {
        cout<<n<<">0";
    }
    else
    {
        cout<<"0=0";
    }
}

 骨牌的铺法

有 2*n的一个长方形方格,用一个1*2的骨牌铺满方格。编写一个程序,试对给出的任意一个n(n>0), 输出铺法总数。

例如n=3时,有以下3种铺法:

 

输入

一个数n
n<=4000

输出

一个数字,表示铺法总数

样例输入 复制
2
样例输出 复制
2
#include<bits/stdc++.h>
using namespace std;
long long f(int n)
{
    int a[4010];
    int i;
    a[1]=1;
    a[2]=2;
    for(i=3;i<=n;i++)
    {
        a[i]=a[i-1]+a[i-2];
    }
    return a[n];
}
int main(){
    int n;
    cin>>n;
    printf("%ld\n",f(n));
	return 0;
}

 简单背包问题

题目描述

简单的背包问题。设有一个背包,可以放入的重量为s。现有n件物品,重量分别为w1,w2…,wn,(1≤i≤n)均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。

输入

第一行两个整数包括放入的物品重量为s(s<=32767)和物品的件数n(n<=50);

    第二行n个整数,表示每件物品的重量(输入数据均为正整数)

输出

若满足条件则输出"YES",若不满足则输出"NO"。

样例输入 复制
20 5
1 3 5 7 9
样例输出 复制
YES
#include<iostream>
using namespace std;
int k(int s,int n,int a[])
{
	if(s==0)
		return 1;
	if(s<0||(s>0&&n<1))
		return 0;
	if(k(s-a[n-1],n-1,a))
	{
		return 1;
	}
	else
		return k(s,n-1,a);		
}
int main()
{
	int s,n,a[100],t;
	cin>>n>>s;
	for(int i=0;i<n;i++)
		cin>>a[i];
	t=k(s,n,a);
	if(t==0)
		cout<<"NO"<<endl;
	else
	    cout<<"YES"<<endl;
	return 0; 
}

 计算N的阶乘

题目描述

请计算n的阶乘(1<=n<=100)
n的阶乘计算公式为:n!=n*(n-1)*(n-2)*...*1,如:5!=5*4*3*2*1=120

输入

一个整数n(1<=n<=100)

输出

n的阶乘

样例输入 复制
20
样例输出 复制
2432902008176640000

这题要高精度 

#include<iostream>
using namespace std;
int main()
{
	int a[2000] = { 0 };
	int n;
	int i,j,m,jing;//jing进位
	cin >> n;
	a[0] = 1;
	for (i = 1; i <= n; i++)
	{
		jing = 0;
		for (j = 0; j < 2000; j++)
		{
			m = a[j] * i + jing;
			a[j] = m % 10;
			jing = m / 10;
		}\
	}
	for (i = 1999; i >= 0; i--)
	{
		if (a[i])
			break;
	}
	for (j = i; j >= 0; j--)
		cout << a[j];
	return 0;
}

 求数列的第n项的值是多少?

题目描述
请问如下数列1,2,2,3,3,3,4,4,4,4……请问这个数列的第n项是多少?

输入
从键盘读入一个整数n,代表要求的项数
输出
一个整数n代表该项的值是多少
样例输入 复制
10
样例输出 复制
4
#include<iostream>
using namespace std;
 
int main()
{
    int n,m;
    cin>>n;
    m=n;
    for(int i=1;i<=20;i++)
    {
        for(int j=1;j<=i;j++)
        {
            m--;
            if(m==0)
            {
                cout<<i;
                return 0;
            }
        }
    }
    return 0;
}

 请问一个正整数能够整除几次2?

题目描述

请问一个正整数n能够整除几次2?
比如:4可以整除2次2,100可以整除2次2,9可以整除0次2。

输入

从键盘读入一个正整数n

输出

输出一个整数,代表n能够整除2的次数

样例输入 复制
8
样例输出 复制
3
#include<stdio.h>
int main()
{
    int n, sum = 0;
    scanf("%d", &n);
    while(n > 1){
        if(n%2 == 1) break;
        n/=2;
        sum++;
    }
    printf("%d",sum);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值