机试笔记-2

1.进制转换类问题

反序数:比如输入123,输出321

int main()
{
    int n;
    cin >> n;
    int ans = 0;
    
    while(n>0){
        ans = ans * 10;
        ans = ans + (n % 10);
        n = n / 10;
    }
    
    cout << ans << endl;
}

10进制转x进制  输入100,8     则输出144

int main()
{
    int n,x;
    char s[105]; 
    
    //输入十进制n与转化进制x
    cin >> n >> x ;
    
    int cnt = 0;
    while(n > 0){
        int w = (n % x);
        if(w < 10) s[cnt++] = w + '0' ;
        else s[cnt++] = (w - 10) + 'A' ;
        
        n = n / x;
    }
    
    for(int i = cnt -1 ; i>=0;i --){
        cout << s[i];
    }  
    
    cout << endl ;
}

x进制转10进制 

int main()
{
    char s[105]; 
    int x;
    //输入x进制字符串以及代表进制的x
    cin >> s >> x ;
    
    int ans = 0;
    int len = strlen(s);
    
    for(int i=0;i<len;i++){
        ans = ans * x;
        if(s[i] >= '0' and s[i] <= '9') ans = ans + (s[i] - '0');
        else ans = ans + (s[i] - 'A') + 10 ;
    }
    
    cout << ans << endl;
}

2.打印图形

打印棱形

int main()
{
     int n;
     cin >> n;
     //上半部分三角
     for(int i=1; i <= n;i++){
         
         for(int j=1;j<=n-i;j++){
             printf(" ");
         }
         
         for(int j = n- i+1;j<n+i;j++){
             printf("*");
         }
         
         printf("\n");
         
     }
     
     //下半部分三角,把上三角倒着输出
     for(int i=n-1; i >= 1;i--){
         
         for(int j=1;j<=n-i;j++){
             printf(" ");
         }
         
         for(int j = n- i+1;j<n+i;j++){
             printf("*");
         }
         
         printf("\n");
         
     }
}

杨辉三角

int main()
{
    int a[21][21] = {0} ;
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n == 0) break;
        a[1][1] = 1;
        for(int i=2;i<=n;i++){
            for(int j=1;j<=i;j++){
                a[i][j] = a[i-1][j]+a[i-1][j-1];
            }
        }

        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                printf("%d ",a[i][j]);
            }
            printf("\n");
        }
    }
}

 日期类问题:考虑闰年的判断,以及时间转换:

1天=24小时,1小时=60分,1分=60秒。

且一天之内时针和分针会重合22次,而非24次。

题目:输入1985 1 20
输出:20
解释:判断这个日期是本月的第几天。

struct node{
    int year,month,day;
}p;

int f[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main()
{
   while(scanf("%d%d%d", &p.year, &p.month , &p.day) != EOF){
       //判断是否是闰年
       if((p.year% 400 == 0) or (p.year % 4 == 0) and (p.year % 100 !=0)) f[2]=29;
       else f[2] =28;
       
       int flag = 0;
       //判断月份与天数是否输入合法
       if(p.month < 1 or p.month > 12) flag = 1;
       if(p.day < 0 or p.day > f[p.month]) flag = 1;
       
       if(flag){
           printf("重新输入\n");
           continue;
       }
       
       int ans = p.day;
       
       for(int i=1; i< p.month;i++) ans = ans + f[i];
       
       cout << ans << endl;
   }
}

字符串类问题:将输入的字符串向后输入三位,其他不变

输入:I love 007

输出:L oryh 007

int main()
{
  char s[105];
  cin.getline(s,105);
  int len = strlen(s);
  
  for(int i= 0;i< len;i++){
      if(s[i] >='A' and s[i] <= 'Z'){
          s[i] = s[i] + 3;
          if(s[i] > 'Z') s[i] = s[i] -26;
      }else if (s[i] >='a' and s[i] <= 'z'){
          s[i] = s[i] + 3;
          if(s[i] > 'z') s[i] = s[i] -26;
      }else{
          continue;
      }
  }
  
  puts(s);
  return 0;
}

排序问题,一句话,sort()就完事。

输入:

8
1 2 3 4 5 6 7 8
输出:
1 3 5 7 2 4 6 8
bool compare(int a,int b){
    if(a % 2 == b % 2) return a < b;
    else return (a%2) > (b%2);
}

int main()
{
    int n;
    int a[1005] = {0};
    cin >> n;
    for(int i = 0;i < n ;i++){
        cin >> a[i];
    }
    sort(a,a+n,compare);
    for(int i = 0;i<n;i++){
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}

查找类问题:常用思想是先sort再二分查,但实际中,无脑map完事

题目:

输入:

4
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
5
02
03
01
04
03

输出:

02 刘唐 男 23
03 张军 男 19
01 李江 男 21
04 王娜 女 19
03 张军 男 19
struct node{
    string num;
    string name;
    string sex;
    int age;
}p;

int main(){
   int n,q;
   map<string,node> M;
   while(scanf("%d",&n) != EOF){
       for(int i=0;i<n;i++){
           cin >> p.num >> p.name >> p.sex >> p.age;
           M[p.num] = p ; // 将学号指向对应结构体
       }
       scanf("%d",&q);
       for(int i=0;i<q;i++){
           string num;
           cin >> num;
           if(M.find(num) != M.end())
           cout << M[num].num <<" " << M[num].name<<" "<<M[num].sex<<" "<<M[num].age<<endl;
           else
           cout << "No!" << endl;
       }
   }
}

题目二:

输入:

5
1 2 3 4 5
3
6
6
3
输出:
no
find
find
int main(){
    int n,q,x;
    map<int,int> M;
    scanf("%d",&n);
    
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        M[x]++;
    }
    
    scanf("%d",&q);
    for(int i=0;i<q;i++){
        scanf("%d",&x);
        if(M[x] == 0){
            printf("no\n");
            M[x]++;
        }
        else printf("find\n");
    }
}

贪心问题:

商店里有 n 中饮料,第 i 种饮料有 mi 毫升,价格为 wi。
小明现在手里有 x 元,他想吃尽量多的饮料,于是向你寻求帮助,怎么样买才能吃的最多。
请注意,每一种饮料都可以只买一部分。
有多组测试数据。
第一行输入两个非负整数 x 和 n。
接下来 n 行,每行输入两个整数,分别为 mi 和 wi。
所有数据都不大于 1000。
x 和 n 都为-1 时程序结束。
请输出小明最多能喝到多少毫升的饮料,结果保留三位小数。
输入:
233 6
6 1
23 66
32 23
66 66
1 5
8 5
-1 -1
输出:
136.000
struct node{
    double w,m;
}p[1005];

bool compare(node a,node b){
    //按照每毫升的价格从低到高排序
    return a.w/a.m <b.w/b.m;
}

int main(){
   int n,x;
   while(scanf("%d%d",&x,&n) != EOF){
       if(x == -1 and n == -1) break;
       for(int i =1; i<=n;i++){
           scanf("%lf%lf",&p[i].m,&p[i].w);
       }
       sort(p+1,p+1+n,compare);
       double ans = 0;
       for(int i =1;i<=n;i++){
           if(x >= p[i].w){ 
               //如果剩余的钱能全买
               ans = ans + p[i].m;
               x = x - p[i].w;
           }else
       { //如果剩余的钱买不完
           ans =  ans + (p[i].m *x / p[i].w);
           break; //到这里x已经为0
       }
       
    }
       printf("%.3lf\n",ans);
   }

}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值