前言:西工大noj刷题记录
代码在CodeBlocks16.01环境下编译通过
34题- 发工资的日子
/*
*题目:如果每个员工工资都知道,那么最少需要准备多少人民币,才能给每位员工发工资的时候不用员工找零呢?
假设员工的工资都是正整数,单位元,人民币一共有100元,50元,10元,5元,2元和1元六种
*/
#include <bits/stdc++.h>
using namespace std;
int noj_034()
{
int num;
int hund = 0, halfHund = 0, ten = 0, five = 0, two = 0, one = 0, sum = 0;
cout << "请输入员工人数n(n<100):";
cin >> num;
int *salary = new int[num];
cout << "请依次输入每位员工的工资:";
for (int i = 0; i < num; ++i)
{
cin >> salary[i];
}
for (int i = 0; i < num; ++i)
{
hund = salary[i] / 100;
halfHund = salary[i] % 100 / 50;
ten = salary[i] % 100 % 50 / 10;
five = salary[i] % 100 % 50 % 10 / 5;
two = salary[i] % 100 % 50 % 10 % 5 / 2;
one = salary[i] - hund * 100 - halfHund * 50 - ten * 10 - five * 5 - two * 2;
sum = sum + hund + halfHund + ten + five + two + one;
}
cout << sum;
delete[] salary;
salary = nullptr;
return 0;
}
35题-向上取整
/*
*题目:编写函数fceil(x),返回大于等于x的最小整数,;例如fceil(2.8)=3,fceil(-2.8)=-2
*/
#include <iostream>
using namespace std;
int fceil(double x)
{
if (x >= 0)
{
if ((int)x == x)
{
return x;
}
else
{
return (int)x + 1;
}
}
else
{
return (int)x;
}
}
int noj_035()
{
double inpt;
cout << "请输入任意实数:";
cin >> inpt;
cout << fceil(inpt);
return 0;
}
36题-循环移位(位运算之前在公司用得还挺多,怀念)
/*
*题目:编写函数实现value左右循环移位(即移出的位在另一端移入),函数原型为int move(int value, int n),
其中value为要循环移位的数,n为移位的位数,n的绝对值不大于16,整型为16位,如果n<0表示左移,n>0表示右移,
n=0表示不移位
*/
#include <iostream>
#include <math.h>
using namespace std;
int move(int value, int n)
{
if (n == 0)
{
return value;
}
else if (n < 0)
{
n = -1 * n;
int base = value << n;
value = value >> (32 - n);
value |= base;
return value;
}
else
{
int base = value >> n;
value = value << (32 - n);
value |= base;
return value;
}
}
int noj_036()
{
int value, num;
cout << "请依次输入value和n:";
cin >> value >> num;
cout << move(value, num);
return 0;
}