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);
}
}
标签:10,int,31,笔记,ans,机试,main,输入 From: https://blog.csdn.net/xc_bbbs1/article/details/140751491