C语言/C++常见习题问答集锦(七十二) 之贪心冰激凌与十六进制字符串变身
程序之美
1、这一天,阳光明媚,风和日丽,小马想去买一堆冰淇淋带回家,老板和他说,我们家的冰淇淋最近正在做活动,A元一个,B元m个
小马想至少买n个冰淇淋,但是又想花最少的钱,你能帮助他写个程序算出他最少要花多少钱呢
输入格式
第一行是T表示有T组数据
接下来t行,每一行分别是n,m,A,B
输出格式
你要对每次结果算出买n个冰淇淋最少要花多少钱
输入样例 复制
2
5 2 2 3
6 2 2 3
输出样例 复制
8
9
数据范围与提示
T<=100
0≤A,B≤1000000,0≤n,m≤1000
对于5 2 2 3 意思是要买5个冰淇淋 A类型冰淇淋2元一个 B类型冰淇淋是3元2个 那么买五个最合适的方式是先买2种B类型 再买1种A类型
6 2 2 3 意思是要买6个冰淇淋 A类型冰淇淋2元一个 B类型冰淇淋是3元2个 那么买6个最合适的方式是先买3种B类型
解法一:
#include<stdio.h>
#include <stdlib.h>
int main()
{
int i,t,n,m,a,b,sum,*op;
scanf("%d", &t);
if (t <= 0)
{
return -1;
}
op = (int *)malloc(sizeof(int) * t);
for(i=0;i<t;i++){
scanf("%d%d%d%d", &n,&m,&a,&b);
sum = n / m * b + n % m * a;
op[i] = sum;
}
for(i=0;i<t;i++){
printf("%d\n",op[i]);
}
free(op);
return 0;
}
运行结果:
解法二:
#include<stdio.h>
int main()
{
int i,t,n,m,a,b,sum;
scanf("%d", &t);
for(i=0;i<t;i++){
scanf("%d%d%d%d", &n,&m,&a,&b);
sum = n / m * b + n % m * a;
printf("%d\n",sum);
}
return 0;
}
运行结果:
2、问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
F
样例输出
65535
解法一:
#include<stdio.h>
int main()
{
char a[9];
int i,pos=0;
long sum=0;
do
{
scanf("%c",&a[pos]);
}while(a[pos++]!='\n');
for(i=0;i<pos-1;i++)printf("%c",a[i]); //若不需要,此行及下一行可以删除
printf("H=");
for(i=0;i<pos-1;i++)
{
if(a[i]>='a'&&a[i]<='f')a[i]-='a'-'A';
if(a[i]>='0'&&a[i]<='9')
sum=sum*16L+(a[i]-'0');
else
sum=sum*16L+(a[i]-'A'+10);
}
printf("%ld\n",sum);
return 0;
}
运行结果:
解法二:
#include <stdio.h>
#include <math.h>
#define N 10
int HexToDem(char ch[]);
int Dem(char ch);
int main()
{
char hex[N];
scanf("%s", hex);
printf("%d\n", HexToDem(hex));
return 0;
}
int HexToDem(char ch[])
{
int num = 0;
const char *p = ch;
while (*p)
{
num = num * 16 + Dem(*p);
p++;
}
return num;
}
int Dem(char ch)
{
if (ch >= '0' && ch <= '9')
{
return ch - '0';
}
switch (ch)
{
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
}
return -1;
}
解法三:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char num[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char input[10];
unsigned int n,i,j,k=0;
gets(input);
n=strlen(input);
for(i=0;i<n;i++)
{
for(j=0;j<17;j++)
{
if(input[i]==num[j])
{
k+=j*pow(16,n-i-1);
}
}
}
printf("%u",k);
return 0;
}