NOI题解(1.6编程基础之一维数组)(补全)

NOI题解(1.6编程基础之一维数组)(补全)_第1张图片

01:与指定数字相同的数的个数

#include "iostream"
using namespace std;
int main()
{
    int count;
    int time=0;
    int num[100];
    cin>>count;
    for(int i=0;i>num[i];
    }
    int cmp;
    cin>>cmp;
    for(int i=0;i

02:陶陶摘苹果

#include "iostream"
using namespace std;
int main()
{
    int num[10];
    for(int i=0;i<10;i++)
    {
        cin>>num[i];
    }
    int high;
    cin>>high;
    int count=0;
    for(int i=0;i<10;i++)
    {
        if(high+30>=num[i])
            count++;
    }
    cout<

03:计算书费


#include "iostream"
#include "iomanip"
using namespace std;
int main()
{
    double money[10]={28.9,32.7,45.6,78,35,86.2,27.8,43,56,65};
    int num[10];
    for(int i=0;i<10;i++)
    {
        cin>>num[i];
    }
    double sum=0;
    for(int i=0;i<10;i++)
    {
//        cout<

04:数组逆序重放

#include "iostream"
#include "iomanip"
using namespace std;
int main()
{
    int count;
    int num[100];
    cin>>count;
    for(int i=0;i>num[i];
    }
    int n=count;
    int temp = count-1;
    if(count%2==0)
        count=count/2;
    else
        count=(count-1)/2;
    for(int i=0;i

05:年龄与疾病

#include "iostream"
#include "iomanip"
using namespace std;
int main()
{
    int n,num1=0,num2=0,num3=0,num4=0,sum=0;
    int num[100];
    cin>>n;
    for(int i=0;i>num[i];
        if(num[i]>=0&&num[i]<=18)
        {
            num1++;
        }else if(num[i]>=19&&num[i]<=35)
        {
            num2++;
        }else if(num[i]>=36&&num[i]<=60)
        {
            num3++;
        }else if(num[i]>=61)
        {
            num4++;
        }
    }
//    cout<

06:校门外的树

#include "iostream"
#include "iomanip"
using namespace std;
int main()
{
    int L,M;
    cin>>L>>M;
    int num1,num2;
    bool flag[10002]={false};//注意一维数组的长度
    for(int i=0;i>num1>>num2;
        for(int j=num1;j<=num2;j++)
            flag[j]=true;
    }
    int count=0;
    for(int i=0;i<=L;i++)
    {
        if(!flag[i])
        {
//            cout<<"i:"<

07:有趣的跳跃

#include "iostream"
using namespace std;
int num[3000];
int dis[3000];
/**
 * 冒泡排序,扫描len次,每次用下标0扫描到len-1-i,比较相邻的两个元素并交换
 * @param num
 * @param len
 */
void bubbleSort(int num[],int len)
{
    for(int i=0;inum[j+1])
            {
                int temp = num[j];
                num[j] = num[j+1];
                num[j+1] = temp;
            }
        }
    }
}
int main()
{
    int n;
    //输入数据总数
    cin>>n;
    //输入数据
    for(int i=0;i>num[i];
    }
    //求出相邻元素差的绝对值,并存储在一维数组中
    for(int i=0;i

08:石头剪刀布

#include "iostream"
using namespace std;
//用一维数组存储AB的出拳序列
int A[100];
int B[100];
//返回1,Awin;返回0,平局,返回-1,Bwin
int result(int ANum,int BNum)
{
    switch (ANum)
    {
        case 0:
            if(BNum==0) return 0;
            else if(BNum == 2) return 1;
            else return -1;
        case 2:
            if(BNum==2) return 0;
            else if(BNum==5) return 1;
            else return -1;
        case 5:
            if(BNum==5) return 0;
            else if(BNum == 0) return 1;
            else return -1;
        default:
            return -2;
    }
}
int main() {
    int tryNum;
    cin >> tryNum;
    int Alen, Blen,ASum = 0,BSum =0;
    cin >> Alen >> Blen;
    for (int i = 0; i < Alen; i++) {
        cin >> A[i];
    }
    for (int i = 0; i < Blen; i++)
    {
        cin >> B[i];
    }
    for(int i=0;iBSum)
        cout<<"A";
    else if(ASum==BSum)
        cout<<"draw";
    else
        cout<<"B";
    return 0;
}

09:向量点积计算

#include "iostream"
using namespace std;

int A[1000];
int B[1000];

int main() {
    int result = 0;
    int Num;
    cin >> Num;
    for(int i = 0 ; i < Num ; i++)
        cin >> A[i];
    for(int i = 0 ; i < Num ; i++)
        cin >> B[i];

    for(int i = 0 ; i < Num ; i++)
    {
        result += A[i]*B[i];
    }
    cout<

10:大整数加法

#include "iostream"
using namespace std;
int A[202]={0};
int B[202]={0};
int result[202];
int C=0;//进位

int main() {
    //是否扫描到首个非零元素
    bool startF = false;

    string tmp;
    string strA,strB;
    cin>>strA>>strB;
    if(strA =="0" && strB=="0")
    {
        cout<<"0";
        return 0;
    }
    //题设给定字符串长度是不一定对齐的
    int LenA = strA.length();
    int LenB = strB.length();
    for(int i=0;iLenB?LenA:LenB;
    for(int i = 0; i <= Len-1 ; i++) {
        result[i] = A[i] + B[i] + C;
        //cout<9)
        {
            C = 1;
            result[i]-=10;
        }else
            C = 0;
    }
    if(C==1) {
        startF = true;
        cout<<"1";
    }
    for (int i = 0; i < Len; i++) {
        tmp += result[i]+'0';
    }
    for(int i=tmp.length()-1;i>=0;i--) {
        if (tmp[i] != '0')
            startF = true;
        if (startF)
            cout <


11:大整数减法

#include "iostream"
using namespace std;
/**
 * 将数字从低位到高位存储到一维数组中
 * 做减法处理(注意是否需要借位)
 * 不打印首位0字符
 */
int A[202]={0};
int B[202]={0};
int result[202];
int C=0;//借位

int main() {
    //是否扫描到首个非零元素
    bool startF = false;
    string tmp;
    string strA,strB;
    cin>>strA>>strB;
//    if(strA =="0" && strB=="0")
//    {
//        cout<<"0";
//        return 0;
//    }
    //题设给定字符串长度是不一定对齐的
    int LenA = strA.length();
    int LenB = strB.length();
    for(int i=0;iLenB?LenA:LenB;
    for(int i = 0; i <= Len-1 ; i++) {
        result[i] = A[i] - B[i] + C;
        //cout<=0;i--) {
        if (tmp[i] != '0')
            startF = true;
        if (startF)
            cout <

12:计算2的N次方

#include "iostream"
using namespace std;
//一维数组存储每位数字
int result[20]={0};
int main()
{
    int N;
    cin>>N;
    result[0] = 1;
    //存储当前被乘数有效位数
    int Len = 1;
    for(int i=0;i=10)
            {
                result[j]-=10;
                result[j+1]++;
                //有进位时,考虑更新被乘数有效位数
                Len = (j+1+1)>Len?(j+1+1):Len;
            }
        }
    }
    //输出
    for(int i=Len-1;i>=0;i--)
    {
        cout<

13:大整数的因子

#include "iostream"
using namespace std;
int result[30];
bool getDiv(string Num,int divNum,int Len)
{
    for(int i=0;i>Num;

    int haveDivNum = false;
    int startOut = true;
    for(int i=2;i<10;i++) {
        if(getDiv(Num,i, Num.length()))
        {
            haveDivNum = true;
            if(startOut) {
                cout << i;
                startOut = false;
            }else
                cout<<" "<

14:求10000以内n的阶乘

#include "iostream"
#include "iomanip"
using namespace std;
int result[10000];
int main()
{
    int n;
    cin>>n;
    if(n==0){
        cout<<1;
        return 0;
    }
    int k=1;
    int C=0;
    result[0] = 1;
    //把大数字分来存储,每个数字不超过9999,因此例如1928321312存储为192 2832 1312
    for(int i=1;i<=n;i++)//乘以1.....n
    {
        C=0;
        //从后向前处理
        for(int j=0;j=10000) {
                C = result[j] / 10000;
                result[j] = result[j] % 10000;
                if (j == k-1 ) {
                    k++;
                    result[j+1] = C;
                    break;
                }
            }else
                C= 0;
            //cout<<"@"<=0;i--)
    {
        if(i==k-1)
            cout<

15:阶乘和

#include "iostream"
#include "iomanip"
using namespace std;
const int MAXLEN = 20;
int sum[MAXLEN];
//将阶乘结果存储在数组中
int* getFac(int n)
{
    //因为我们在函数体外需要使用这个一维数组,所以需要new
    int* result= new int[MAXLEN];
    for(int i=0;i=10000) {
                C = result[j] / 10000;
                result[j] = result[j] % 10000;
                if (j == k-1 ) {
                    k++;
                    result[j+1] = C;
                    break;
                }
            }else
                C= 0;
            //cout<<"@"<>n;
    for(int i=1;i<=n;i++)
    {
        int* tmp = getFac(i);
        for(int i=0;i=10000)
            {
                C=sum[i]/10000;
                sum[i]=sum[i]%10000;
            }else
                C = 0;
        }
    }
    //输出结果
    bool startF = false;
    bool firstF = true;
    for(int i=MAXLEN;i>=0;i--)
    {
        if(sum[i])
            startF = true;
        if(startF) {
            if(firstF) {
                cout << sum[i];
                firstF = false;
            } else {
                cout.fill('0');
                cout << setw(4) << sum[i];
            }
        }
    }
}



你可能感兴趣的:(NOI题解)