OJ基础题库(2)

  • Post author:
  • Post category:其他

网上的算法:
#include<bits/stdc++.h>
using namespace std;
int main()
{
  char a[201],b[201];
  int l,c[201],p=0;//初始化不能忘
  while(cin>>a>>b)
  {
      l=max(strlen(a),strlen(b));
      for(int i=0;i<=l;i++)
      {
          if(i<strlen(a))
            p+=a[strlen(a)-i-1]-'0';
          if(i<strlen(b))
            p+=b[strlen(b)-i-1]-'0';
          c[i]=p%10;
          p=p/10;
      }
      int len=0;
      for(len=l;c[len]==0&&len>0;len--);
      for(;len>=0;len--)
        cout<<c[len];
    cout<<endl;
  }
  system("pause");
}

我的错误算法 我没有考虑到数组下标的问题 计算是从左往右 而正常运算是从右往左  待改进
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
    int flag=1;
    while(flag){
        int a[200],b[200],c[400];
        int i,j=0;
        for(i=0;i<200;i++)
            a[i]=b[i]=-1;
        for(i=0;i<400;i++)
            c[i]=-1;
        int flag2=1;
        while(flag2){
            char temp;
            scanf("%c",&temp);
            if(temp=='\n'){
                flag2=0;
                break;
            }
            a[j++]=int(temp)-48;
        }
        int flag3=1;j=0;
        while(flag3){
            char temp2;
            scanf("%c",&temp2);
            if(temp2=='\n'){
                flag3=0;
                break;
            }
            b[j++]=int(temp2)-48;
        }
        i=0;
        int temp3;
        while(a[i]!=-1 && b[i]!=-1){
            if(i==0)
                temp3=0;
            int result=a[i]+b[i];
            cout<<"result:"<<result<<endl;
            result+=temp3;
            cout<<"result+temp3:"<<result<<endl;
            c[i]=result%10;
            cout<<"c[i]:"<<a[i]<<endl;
            temp3=result/10;
            cout<<"temp3:"<<temp3<<endl;
            i++;
        }
        int temppp=0;
        if(a[i]!=-1){
            while(a[i]!=-1){
                temppp=a[i]+temp3;
                c[i]=temppp%10;
                temp3=temppp/10;
                i++;
            }    
            if(temp3!=0)
                c[i]=temp3;
        }
        if(b[i]!=-1){
            while(b[i]!=-1){
                temppp=b[i]+temp3;
                c[i]=temppp%10;
                temp3=temppp/10;
                i++;
            }
            if(temp3!=0)
                c[i]=temp3;    
        }
        i=0;
        while(c[i]!=-1)
            cout<<c[i++];
        cout<<endl;
    }

}


#include<stdio.h>
#include<string.h>
int main(){
    char a[201],b[201],t[201];
    int la,lb,c[201]={0},p=0,i;
    while(~scanf("%s %s",a,b)){
        la=strlen(a);lb=strlen(b);
        for(i=0;i<201;++i)
            c[i]=0;
        //如果la<lb之后两个数互换 长度也互换
        if(la<lb||(la==lb&&strcmp(a,b)<0)){
            //printf("-");
            strcpy(t,a);
            strcpy(a,b);
            strcpy(b,t);
            la+=lb;
            lb=la-lb;
            la-=lb;
        }
        for(i=0;i<=la;i++){
            if(i<=lb) c[i]=a[la-i]-b[lb-i]-p;
            else c[i]=a[la-i]-'0'-p;
            if(c[i]<0){
                p=1;
                c[i]+=10;
            }
            else p=0;
        }
        for(i=la;c[i]==0;i--);
        if(i<1)printf("0");
        for(;i>0;i--)printf("%d",c[i]);
        printf("\n");
    }
    return 0;
}



#include <stdio.h>
int main(){
    int a[100000],l,i,j,n;
    while(~scanf("%d",&n)){
        a[1]=1;
        for(i=2;i<100000;i++)
            a[i]=0;
        l=2;
        for(i=1;i<=n;i++){
            for(j=1;j<l;j++)
                a[j]*=i;
            for(j=1;j<l;j++){
                a[j+1]+=a[j]/10;
                a[j]%=10;
            }
            for(;a[l];l++){
                a[l+1]+=a[l]/10;
                a[l]%=10;
            }
        }
        for(i=l-1;i;i--)
            printf("%d",a[i]);
        printf("\n");
    }
    return 0;
}



#include<stdio.h>
#include<string.h>
int main(){
    char sa[102],sb[102];
    int a[202],b[202],c[202];
    int la,lb,lc,i,j,k;
    while(~scanf("%s%s",sa,sb)){
        la=strlen(sa);
        lb=strlen(sb);
        for(i=0;i<la;i++)
            a[i]=sa[la-1-i]-'0';
        for(i=0;i<lb;i++)
            b[i]=sb[lb-1-i]-'0';
        for(i=0;i<202;i++)
            c[i]=0;
        lc=la+lb-1;
        for(i=0;i<la;i++){
            for(j=0;j<lb;j++){
                c[i+j]+=a[i]*b[j];
            }
            for(k=0;k<lc;k++){
                c[k+1]+=c[k]/10;
                c[k]%=10;
            }
            for(;c[lc];lc++){
                c[lc+1]+=c[lc]/10;
                c[lc]%=10;
            }
        }
        for(lc--;lc>=0;lc--)
            printf("%d",c[lc]);
        printf("\n");
    }
    return 0;
}



#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
typedef struct LNode{
    string name;
    int id;
    struct LNode *next;    
}LNode,*LinkList;
int main(){
    int N;
    while(cin>>N){
        LNode *Head;
        Head=(LNode *)malloc(sizeof(LNode));
        Head->next=NULL;
        int i;
        LNode *p=Head;
        for(i=1;i<=N;i++){
            LNode *Person=new LNode;
            Person->id=i;
            cin>>Person->name;
            p->next=Person;
            p=p->next;
        }
        p->next=Head->next;
        int W,S;
        scanf("%d,%d",&W,&S);
        p=Head->next;
        while(p->id!=W){
            p=p->next;
        }
        int people_num=N;
        LNode *prep;
        string a[N];
        int temp=0;
        while(people_num!=1){
            int i=1;
            while(i<S){
                p=p->next;
                i++;
                if(i==S-1)
                    prep=p;    
            }
            //接下来删除节点 不单独弄个函数了
            a[temp++]=p->name;
            prep->next=p->next;
            p=prep->next;
            people_num--;
        }
        if(people_num==1)
            a[temp]=p->name;
        for(i=0;i<N;i++)
            cout<<a[i]<<endl;
    }
    
    return 0;
}



补充 cin遇到空格 换行符 tab键会停止写入 写入的多余的内容会留在缓冲区 后续再需要cin或者getline的时候会把这部分多余的数据给先输入进去
所以为了避免换行符影响 使用getline的时候要优先把缓冲区不需要的东西拿走或者直接清空缓冲区
#include<iostream>
#include<string>
using namespace std;
void process(string content){
    int i=content.length();
    for(int j=0;j<i;j++){
        if(int(content[j])>=65 && int(content[j])<=69){
            content[j]=char(int(content[j])+21);
        }
        else if(int(content[j]>=70 &&int(content[j])<=90)){
            content[j]=char(int(content[j])-5);    
        }
    }
    cout<<content<<endl;
}
int main(){
    int flag=1;
    string start;
    string end;
    string content;
    while(flag){
        start.clear();
        end.clear();
        content.clear();
        cin>>start;
        if(start=="ENDOFINPUT"){
            flag=0;
            break;
        }
        if(start=="START"){
            int flag2=1;
            while(flag2){
                cin.get();  //先把缓冲区的内容拿走
                //可能geiline会直接跳过 因为其会先从缓冲区读取数据 上一次输入的换行符还留在缓冲区 会被直接读取从而跳过
                getline(cin,content);  //string类直接cin会被空格截断 getline不会
                cin>>end;
                if(end =="END"){
                    process(content);
                    flag2=0;
                    break;
                }else{
                    content+=end;  //应对可能的情况 换行继续输字符
                }    
            }
        }
    }
    return 0;
}



#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int i,j;
        int a[n][n];
        int num=0;
        for(j=0;j<n;j++){
            if(j==0 || j%2==0){
                for(i=0;i<n;i++){
                    a[i][j]=++num;
                }
            }else if(j%2!=0){
                for(i=n-1;i>=0;i--){
                    a[i][j]=++num;
                }    
            }
        }
        for(i=0;i<n;i++)
            for(j=0;j<n;j++){
                if(j!=n-1)
                    cout<<a[i][j]<<" ";
                else{
                    cout<<a[i][j]<<" "<<endl;
                }
            }
        cout<<endl;
    }
    return 0;
}



#include<iostream>
#include<cmath>
using namespace std;
int judge(int month){
        if(month==1 || month==3 || month==5 ||month==7 || month==8||month==10||month==12)
            return 31;
        else if(month==2)
            return 28;
        else
            return 30;
}
int main(){
    int n;
    while(cin>>n){
        while(n>0){
            int a,b,c,d,e;
            int days=0;
            cin>>a>>b>>c>>d>>e;
            if(a==d)
                days=e-b;
            else if(a<d){
                days=judge(a)-b;
                for(int i=a+1;i<d;i++)
                    days+=judge(i);
                days+=e;
            }
            cout<<int(c*pow(double(2),days))<<endl;  //数据类型int很重要 否则报错
            n--;
        }
    }
    return 0;
}



我的算法 结果正确 但是时间耗费太多了 没有办法通过
#include<iostream>
using namespace std;
int juage(int a,int b){
    int k;
    for(k=2;k<=a;k++){
        if(a%k==0&&b%k==0)
            return 0;
    }
    if(k>a)
        return 1;
}
int main(){
    int n;
    while(cin>>n){
        if(n==0)
            break;
        int i,j;
        int a[n];
        for(i=0;i<n;i++){
            cin>>a[i];
        }
        int num=0;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++){
                if(juage(a[i],a[j]) && a[i]<a[j])
                    num++;
            }
        cout<<num<<endl;
    }
    return 0;
}

优化版算法 运用递归节省时间
//运用递归减少时间
#include<stdio.h>
#include<iostream>
#define N 601
using namespace std;
int panduan(int a,int b)//求最大公约数
{
    if(a%b==0)
    {
        return b;
    }
    else
    {
        return panduan(b,a%b);
    }
}
int main()
{
    int n,i,j,cxk=0;
    int a[N];
    while(cin>>n)
    {
        if(n==0)
        break;
        int cxk=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=1;i<=n-1;i++)
        {
            for(j=1;j<=n-i;j++)
            {
                if(panduan(a[i],a[i+j])==1)
                cxk++;
            }
        }
        cout<<cxk<<endl;
    }
    return 0;
}



#include<iostream>
using namespace std;
int marked;
string compare(string a,string b){
    int i=1;
    int flag=1;
    while(flag){
        if(i==int(a.length())){
            marked=1;
            return a;
        }
        if(i==int(b.length())){
            return b;
            marked=2;
        }
        if(int(a[i])>int(b[i])){
            flag=0;
            marked=1;
            return a;
        }else if(int(a[i])<int(b[i])){
            flag=0;
            marked=2;
            return b;
        }else{
            i++;
        }
    }
}
int main(){
    int n;
    while(cin>>n){
        string a[n];
        int i=0;
        while(i<n){
            cin>>a[i];
            i++;
        }
        string result;
        int temp=n;
        string temps="0";
        while(temp){
            int mark;
            for(i=0;i<n;i++){
                if(int(a[i][0])>int(temps[0])){
                    temps.clear();
                    temps=a[i];
                    mark=i;
                }else if(int(a[i][0])==int(temps[0])){
                    string temps2=compare(a[i],temps);
                    temps.clear();
                    temps=temps2;
                    if(marked==1){
                        mark=i;
                    }
                }
            }
            result+=temps;
            a[mark].clear();
            a[mark]="0";
            temps="0";
            temp--;
        }
        cout<<result<<endl;
    }
    return 0;
}


版权声明:本文为weixin_51339377原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。