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

编程入门 行业动态 更新时间:2024-10-28 05:22:15


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

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

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<<count;
    return 0;
}

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<<num[i]<<" "<<money[i]<<endl;
        sum+=num[i]*money[i];
    }
    cout<<fixed<<setprecision(1)<<sum<<endl;
    return 0;
}

04:数组逆序重放

#include "iostream"
#include "iomanip"
using namespace std;
int main()
{
    int count;
    int num[100];
    cin>>count;
    for(int i=0;i<count;i++)
    {
        cin>>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<count;i++)
    {
        int m;
        m=num[i];
        num[i]=num[temp];
        num[temp]=m;
        temp--;
    }
    for(int i=0;i<n;i++)
    {
        cout<<num[i]<<" ";
    }
    return 0;
}

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<n;i++)
    {
        cin>>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<<num1<<" "<<num2<<" "<<num3<<" "<<num4<<endl;
    sum=num1+num2+num3+num4;
    cout<<fixed<<setprecision(2)<<num1*100/(double)sum<<"%"<<endl<<num2*100/(double)sum<<"%"<<endl<<num3*100/(double)sum<<"%"<<endl<<num4*100/(double)sum<<"%";
    return 0;
}

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<M;i++)
    {
        cin>>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:"<<i<<endl;
            count++;
        }
    }
    cout<<count;
    return 0;
}

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;i<len;i++)//比较次数
    {
        for(int j=0;j<len-1-i;j++)//比较位置
        {
            if(num[j]>num[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<n;i++)
    {
        cin>>num[i];
    }
    //求出相邻元素差的绝对值,并存储在一维数组中
    for(int i=0;i<n-1;i++)
    {
        dis[i]=abs(num[i+1]-num[i]);
    }
    //对一维数组进行排序
    bubbleSort(dis,n-1);
    //判断是否符合条件
    for(int i=1;i<=n-1;i++)
    {
        if(dis[i-1]!=i) {
            cout << "Not jolly";
            return 0;
        }
    }
    cout<<"Jolly";
    return 0;
}

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;i<tryNum;i++)
    {
        int temp = result(A[i%Alen],B[i%Blen]);
        if(temp==1)
            ASum++;
        if(temp==-1)
            BSum++;
    }
    if(ASum>BSum)
        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<<result;
    return 0;
}

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;i<LenA;i++)
    {
        A[i] = strA[LenA-1-i]-'0';
    }
    for(int i=0;i<LenB;i++)
    {
        B[i] = strB[LenB-1-i]-'0';
    }
    int Len = LenA>LenB?LenA:LenB;
    for(int i = 0; i <= Len-1 ; i++) {
        result[i] = A[i] + B[i] + C;
        //cout<<result[i]<<endl;
        if(result[i]>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 <<tmp[i];
    }
    return 0;
}


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;i<LenA;i++)
    {
        A[i] = strA[LenA-1-i]-'0';
    }
    for(int i=0;i<LenB;i++)
    {
        B[i] = strB[LenB-1-i]-'0';
    }
    int Len = LenA>LenB?LenA:LenB;
    for(int i = 0; i <= Len-1 ; i++) {
        result[i] = A[i] - B[i] + C;
        //cout<<result[i]<<endl;
        if(result[i]<0)
        {
            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 <<tmp[i];
    }
    if(C==0&&startF==false)
        cout<<"0";
    return 0;
}

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<N;i++)//处理N次*2
    {
//        cout<<Len<<endl;
        //对每位做乘2处理
        for(int j=0;j<Len;j++)
        {
            result[j] = result[j]*2;
        }
//        for(int j=0;j<Len;j++)
//        {
//            cout<<"#"<<result[j]<<endl;
//        }
        //对每位超过10的,做-10并进位处理
        for(int j=0;j<Len;j++)
        {
            if(result[j]>=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<<result[i];
    }
}

13:大整数的因子

#include "iostream"
using namespace std;
int result[30];
bool getDiv(string Num,int divNum,int Len)
{
    for(int i=0;i<Num.length();i++)
    {
        result[i]=Num[i]-'0';
    }
    int C = 0;
    //从高位到低位依次除以被除数,并将余数算进下一位
    for(int i=0;i<Len;i++)
    {
        result[i]=result[i]+10*C;
        C=result[i]%divNum;
    }
    //如果到个位有余数,说明不能被整除
    if(C==0)
        return true;
    else
        return false;
}

int main()
{
    string Num;
    cin>>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<<" "<<i;
        }
    }
    if(!haveDivNum)
        cout<<"none";
}

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<k;j++)
        {
            result[j]=(result[j])*i+C;
            //cout<<"#:"<<j<<" "<<result[0]<<" "<<result[1]<<endl;
            if(result[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<<"@"<<C<<" "<<result[j]<<" "<<k<<endl;
        }
    }
    for(int i=k-1;i>=0;i--)
    {
        if(i==k-1)
            cout<<result[i];
        else {
            cout.fill('0');
            cout << setw(4) << result[i];
        }
    }
}

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<MAXLEN;i++)
    {
        result[i]=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<k;j++)
        {
            result[j]=(result[j])*i+C;
            //cout<<"#:"<<j<<" "<<result[0]<<" "<<result[1]<<endl;
            if(result[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<<"@"<<C<<" "<<result[j]<<" "<<k<<endl;
        }
    }
    return result;

}

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int* tmp = getFac(i);
        for(int i=0;i<MAXLEN;i++)
        {
            sum[i]+=*(tmp+i);
        }
        int C = 0;
        //阶乘相加,注意进位处理
        for(int i=0;i<MAXLEN;i++)
        {
            sum[i] = sum[i]+C;
            if(sum[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题解(1.6编程基础之一维数组)(补全)

本文发布于:2023-06-14 02:05:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1426148.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:题解   数组   基础   NOI

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!